我正在开发AngularJS客户端。我有一个用作属性的自定义指令。该指令检查元素的访问级别,并在不允许当前用户使用它时将其设置为禁用。
当同一元素具有ng-disabled
属性时,问题就开始了。在这种情况下,ng-disabled
设置元素的能力,更不用说我在自定义指令中设置的内容。
例如我有一个按钮,如果表单无效,应该禁用该按钮。同时我想使用我的自定义指令,以便在用户没有使用权限的情况下将按钮设置为禁用。
<button ng-disabled="myFrm.myCtrl.$invalid" my-custom-directive="controlName"/>
Inside myCustomDirective
我检查是否允许用户激活命名控件。如果不是 - 我将disabled属性设置为元素。但是,如果myFrm.myCtrl.$invalid
为false ng-disabled
,则删除已禁用的属性,并启用该按钮。
这个问题有解决办法吗?如何防止ng-disabled执行其操作?
答案 0 :(得分:0)
您的示例指令是否反映了您将实际指令应用于按钮元素的方式?我注意到你的example指令没有遵循正确的命名约定,即使指令名中的每个大写字母都带有一个前导连字符的小写字母。即myCustomDirective应该应用于按钮,如下所示:
<button ng-disabled="myFrm.myCtrl.$invalid" my-custom-directive="controlName"/>
否则您的指令将不会被编译或链接到该按钮。
在没有看到实际代码的情况下,我能想到的另一件事是指令的优先级。根据{{3}}的角度文档:
该指令以优先级100执行。
默认情况下,自定义指令的优先级为0.只要您没有更改此指令参数,就应该在ng-disabled之后编译指令并在ng-disabled之后进行链接,因此对该按钮是否有最终决定权被禁用或启用。
- 编辑 - 您应该将一个监视添加到myFrm.myCtrl。$ invalid,如另一个建议的那样,并在值发生变化时重新应用您的指令规则。你不需要将整个控制器传递给你的指令,你可以简单地在myFrm.myCtrl上使用双向绑定。$ invalid。我不确定$ watch优先级是如何工作的。我希望,因为你的指令将首先被编译,它将在myFrm.myCtrl上应用它的监视。在ngDisabled之后$ $无效,并且希望这意味着它将处理myFrm.myCtrl的值更改。在ngDisable之后$ $无效,以便你的指令具有关于适用什么规则的最后决定权。
答案 1 :(得分:0)
最后,我找到了解决问题的方法。我没有看到ng-disabled变量,而是从变量中完全取消了ng-disabled。为了做到这一点,我在我自己的指令中将ng-disabled设置为allways。我的指令是一个属性,所以在我尝试了一些不同的方法之后,解决方案是在我的指令构造函数中添加以下代码:
this.isDisabled = "true";
this.attrs["ngDisabled"] = this.isDisabled;
将this.isDisabled设置为“true”作为字符串而非布尔值非常重要。否则它不起作用。