如何使用javascript在外部修改表单元素的ng disabled属性并使其生效?

oxcyiej7  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(248)

我有一个带有form和form元素的angularjs指令。我无法对该指令的原始标记或代码进行任何更改。一个表单元素有一个ng disabled=“some expression”。我想在页面加载后更改此表达式。因此,我使用jquery的ready函数将表达式更改为另一个表达式(我可以获取对作用域和控制器的引用,并使用$apply()。这里可能不适用。)
加载页面时,我看到元素已禁用ng=“my new expression”。在页面加载时,新表达式的计算结果为true,但由于原始表达式的计算结果为false,因此元素未被禁用。

<button.... ng-disabled="some expression" ...></button> <--- original one. I can't change its code

<button.... ng-disabled="a new expression" ...></button> <--- after page loads

我知道改变表达是不够的。如何让angularjs计算更新的表达式,并根据更新表达式的结果禁用或启用按钮?

sh7euo9m

sh7euo9m1#

在更改表达式之后,您需要以某种方式重新编译元素,然而,在angular之外执行此操作可能太棘手。
如果你看看源代码https://github.com/angular/angular.js/blob/9bff2ce8fb170d7a33d3ad551922d7e23e9f82fc/src/ng/directive/attrs.js 您可能会看到ngdisabled指令只是添加了一个观察程序来设置属性值,所以您可以删除该观察程序并添加自己的观察程序:

_.remove($scope.$$watchers, w => w.exp === 'some expression');

$scope.$watch('a new expression', function newWatchFn(value) {
        // you can use another selector for element ofc. or get elem before outside this watch
        angular.element(document.querySelector('[ng-disabled="some expression"]')).attr('disabled', !!value);
});

注意,虽然这是非常棘手和不稳定的-很难找到正确的观察者和正确的元素,如果该元素是用ng重新创建的,如果这个黑客已经消失,等等。但它是有效的。

相关问题