2016-09-14 14 views
0

我正在开发AngularJS客户端。我有一个自定义指令用作属性。该指令检查元素的访问级别,并将其设置为禁用,如果当前用户不被允许使用它。ng禁用覆盖自定义指令行为

当同一元素具有ng-disabled属性时,问题就开始了。在这种情况下,ng-disabled设置元素的能力,而不用介意我在自定义指令中设置的内容。

例如我有一个按钮,应该禁用的情况下,表单无效。同时我想使用我的自定义指令来设置按钮被禁用,如果用户没有使用它的授权。

<button ng-disabled="myFrm.myCtrl.$invalid" my-custom-directive="controlName"/> 

Inside myCustomDirective我检查是否允许用户激活指定的控件。如果没有 - 我将disabled属性设置为元素。但如果myFrm.myCtrl.$invalid为假ng-disabled删除禁用的属性,并启用按钮。

有没有解决这个问题的方法?我如何防止ng-disabled执行其操作?

+0

分享一些代码将有助于快速解决 –

+0

不确定它是否是一个好主意,但是我们不能将'myFrm.myCtrl'传递给该指令,并相应地在$ scope中设置一些布尔值,然后可以*观察它* by'ng-disabled' –

回答

0

最后我找到了解决我的问题的方法。我没有看到ng-disabled变量,而是将它的变量禁用了ng-disabled。为了做到这一点,我已经在我自己的指令中设置了ng-disabled。我的指令是一个属性,所以以后我已经尝试了一些不同的方法来做到这一点,解决办法是在我的指令构造函数中添加以下代码:

this.isDisabled = "true"; 
this.attrs["ngDisabl​ed"] = this.isDisabled; 

它的this.isDisabled设置是非常非常重要的“true”作为字符串而不是布尔值。否则它不起作用。

0

您的示例指令是否反映了您如何将实际指令应用于按钮元素?我注意到你的示例指令并没有遵循正确的命名约定,即在指令名称中使用带连字符的小写字母作为每个大写字母。即myCustomDirective应适用于该按钮,像这样:

<button ng-disabled="myFrm.myCtrl.$invalid" my-custom-directive="controlName"/> 

否则你的指令将不会进行编译或链接该按钮。

我不能看到实际的代码,我能想到的唯一的其他事情就是指令的优先级。据为the ngDisabled directive角文档:

该指令在执行优先级100

默认定制指令具有为0的优先级,只要你没有改变这个指令参数的指令应该在禁用ng之后编译并在禁用ng之后进行链接,因此最终说明该按钮是否被禁用或启用。

- 编辑 - 您应该添加一个手表myFrm.myCtrl。$无效,正如其他人所建议的,并重新应用您的指令规则,无论值何时更改。您不需要将整个控制器传递给您的指令,但您可以简单地在myFrm.myCtrl。$无效的情况下使用双向绑定。我不确定$ watch的优先权是如何工作的。我希望,因为你的指令将被编译首先它将应用它的手表在myFrm.myCtrl。$无效后ngDisabled做,并希望这意味着它将处理myFrm.myCtrl的值更改$ ngDisable后无效,以便您的指令有关于应用什么规则的最终说法。

+0

嗨@dustfinger,谢谢你的回复。当然你是对的,在这个例子中我的自定义指令名称的例子是错误的。这不是真正的代码示例,所以它不是问题。我将在我的问题中编辑这一点。 –

+0

我也试过你建议的解决方案。这是行不通的。问题是ng-disabled在变量上有它自己的监视。它已注册到我的自定义指令的手表bofore中,但我的手表功能已激活。出于某种原因,Angular在它的摘要循环中激活了从开始到结束的注册功能,与注册顺序相反。我会尝试更改指令优先级。 –