gpt4 book ai didi

javascript - 在指令中调用 $setViewValue 不会在 Controller 中触发 $watch

转载 作者:行者123 更新时间:2023-11-28 08:02:43 26 4
gpt4 key购买 nike

我正在使用带有这样的 ngModelController 的指令

  var directive = {
link: link,
restrict: 'E',
require: '?ngModel'
}

我的链接函数执行类似的操作(我省略了长指令的内容)

function link(scope, element, attrs, ctrl) {

scope.updateModel = function(){
var newModel = {};
newModel.aValue = 'foo';
ctrl.$setViewValue(newModel);
}

}

我在 Controller 中使用该指令

查看:已正确更新

<my-directive ng-model="aModel">
{{aModel.aValue}} // This is changed correctly when I update the value in the directive
</my-directive>

Controller :这是我遇到问题的地方

$scope.aModel = {};
$scope.aModel.aValue = 'bar';

$scope.$watch('aModel', function(newValue, oldValue){
console.log('aModel changed'); // This is never fired
});

$scope.$watch('aModel.aValue', function(newValue, oldValue){
console.log('aModel changed'); // This is neither fired
});

$setViewValue 的文档说

"Note that calling this function does not trigger a $digest."

所以我尝试使用 $render$digest$apply 手动触发它,但自从控制台以来每次都会遇到麻烦表示$digest 已经在进行中
那么这有什么问题呢?

更新

我刚刚意识到一些非常有趣的事情。
添加 $timeout 来检查 Controller 中的值,我意识到它实际上并未更改,这可能就是未调用 $watch 函数的原因。 但由于 View 已更新,我不太明白这一点。

情况是这样的:

Controller

$timeout(function(){
console.log('Check aModel value in the controller');
console.log($scope.aModel.aValue); // This is always 'bar' even if the view display 'foo'
},10000);

更新2

我想我发现了问题:ngModel不能是一个对象,但它必须是一个值。
我将问题悬而未决,看看是否有人提出不同的解决方案,但我想这就是重点。

更新3
我错了,您可以将 ngModel 更新为对象,但无法触发 $watch 方法。
我创建a plunker to show the problem .
我设置了较长的超时以避免任何 $digest 进行中的问题。
任何提示将非常感激。

最佳答案

将第三个参数true添加到$watch函数中。

关于javascript - 在指令中调用 $setViewValue 不会在 Controller 中触发 $watch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25201475/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com