代码之家  ›  专栏  ›  技术社区  ›  Raekh Void

ng在自定义指令内禁用不起作用[重复]

  •  0
  • Raekh Void  · 技术社区  · 7 年前

    我试图实现一个自定义指令,强制用户按住按钮,而不是仅仅单击按钮,以防止出现大量错误。按钮下有一个材质设计滑块,显示用户单击按钮的时间。

    但有时,必须有按钮不能点击的时刻,例如,如果有一个表单的值不正确。 我试图设置ng disabled属性,但没有任何效果。我做错了什么?

    negoceExpedApp.directive('rkMouseHold', function ($interval, $timeout) {
        return {
            restrict: 'E',
            scope: {
                text: '=buttonText',
                callback: '&callback',
                isDisabled: '&isDisabled'
            },
            replace: true,
            template: "<div style='width:fit-content'>" +
                "<md-button ng-disabled='{{disabled}}' class='md-accent md-raised md-hue-400'>{{ text }} - {{ disabled }}</md-button><br>" +
                "<md-progress-linear ng-show='c!=0' class='md-accent md-hue-400' md-mode='determinate' value='{{c/10}}'></md-progress-linear>" +
                "</div>",
            link: function (scope, element, attrs) {
                scope.$watch(scope.isDisabled,(newVal)=>{
                    console.log("%c newVal","color:orange",newVal);
                    if(newVal==true){
                        scope.disabled = "true";
                    } else {
                        scope.disabled = 'false';
                    }
                })
                scope.c = 0;
                scope.loop = null;
                element.on('mousedown', () => {
                    scope.loop = $interval(function () {
                        $timeout(() => {
                            scope.c += 100
                        }, 0);
                    }, 100);
                });
    
                element.on('mouseup', () => {
                    $interval.cancel(scope.loop);
                    if (scope.c > 1000) {
                        scope.callback();
                    }
                    scope.c = 0;
                })
            }
        }
    })
    

    Html:

    <rk-mouse-hold callback="ctrl.saveForm()"
                   is-disabled="expedForm.$invalid"
                   button-text="'HOLD TO SAVE'">
    </rk-mouse-hold>
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   georgeawg    7 年前

    ngDisabled 这只是一个常规的总结 disabled

       if(newVal==true){
            scope.disabled = "true";
        } else {
            scope.disabled = 'false';
        }
    

    可以简化为

      scope.disabled = !!newVal;
    

    错误的

    <md-button ng-disabled='{{disabled}}' class='md-accent md-raised md-hue-400'>
        {{ text }} - {{ disabled }}
    </md-button><br>"
    

    使用 ng-disabled='disabled' 而不是 ng-disabled='{{disabled}}'

    在本例中,您传递的是精确的布尔值,而您所做的是—每次传递的字符串值都被视为true。

    毕竟,在您的范围内,您是这样定义自定义禁用的

    isDisabled: '&isDisabled'
    

    & great article 至于正确的绑定,请将代码替换为

    isDisabled: '@'