我正在编写一个属性指令,其中如果设置了一个变量,它会将disabled属性添加到所有输入和按钮,实质上使表单只读。这是一个功能请求...表单用于过期数据,但客户希望在需要时查看。
无论如何,我在视图上有一些输入和按钮,并且我编写了一些包含输入,选择和按钮的自定义指令。出于某种原因,无论如何,我都无法获取属性指令我正在处理.find()输入并在我的自定义指令中选择,除非我对.find()使用$ timeout。这是我到目前为止所拥有的。它有效,但我知道我的同事将不愿使用$ timeout。
'use strict';
angular.module('induction').directive('sttiDisabled',['$timeout', function($timeout) {
return {
restrict: 'A',
link: function postLink(scope, elem, attrs) {
var hello = function () {
var formControls = angular.element(elem.querySelectorAll('input, select, button'));
for (var i = 0; i < formControls.length; i++) {
var el = angular.element(formControls[i]);
el.attr('disabled', scope.ceremony.locked);
console.log(el);
};
};
// Don't judge. It works flawlessly.
var promise = $timeout(hello, 0);
}
}
}]);
你使用这样的东西:
<div stti-disabled>
<input ng-model="blah" />
<select ng-model="blah2" />
<custom-directive-containing-an-input> </that>
</div>
如果scope.ceremony.locked === true,则将禁用输入和选择,但不会禁用自定义指令中的输入...除非我使用超时。
编辑:可能是Avoiding timeouts in Angular applications的骗局,但我想再次提出这个问题,因为自2014年以来情况可能已发生变化。
答案 0 :(得分:1)
要停用群组中的所有输入,请将ng-disabled directive与<fieldset>
element一起使用:
<fieldset ng-disabled="formDisable">
<input ng-model="blah" />
<select ng-model="blah2"
ng-options="name for name in [1,2,3]">
</select>
<custom-directive-containing-an-input>
</custom-directive-containing-an-input>
<br>input = {{blah}}
<br>select = {{blah2}}
<br>disable = {{formDisable}}
</fieldset>
<input type=checkbox ng-model="formDisable"/>Disable form
你有没有尝试过:
scope.$watch("ceremony.locked", hello);
有关范围方法的更多信息,请参阅AngularJS scope API Reference。
<强>更新强>
使用$timeout
调用你的&#34;你好&#34;的方法同步的方法完美无缺;它的工作脆弱。如果您使用更多$timeout
s的应用程序,会发生什么?您无法保证调用函数的顺序。
通过使用$watch
,您可以保证“你好”。当感兴趣的范围变量被初始化并且变化时,函数被调用。