有1个角度应用程序,1个父控制器和一个子控制器。 在这个孩子中,OBJ-CHILD有1美元的WATCH-CHILD手表可以触发$ emit。 在父级中,有一个$ emit的监听器,我们将它称为ON-LISTENER,并为OBJ-PARENT监视$ watch WATCH-PARENT(使用true作为第三个参数)。
当孩子的OBJ-CHILD被改变时,它会触发WATCH-CHILD,触发$ emit。 激活父侦听器ON-LISTENER,并更改OBJ-PARENT。它还设置了一些$ location属性。 OBJ-PARENT的$ watch WATCH-PARENT永远不会被触发(即使值已经改变),以及$ location上设置的属性在浏览器URL中没有改变(我知道它们确实在JavaScript中被改变了,因为我打印它们。)
为了确保在$ digest中调用ON-LISTENER,我试图在ON-LISTENER结束时调用$ digest,并得到预期的异常。
我知道我做错了什么吗?我希望ON-LISTENER中发生的更改能够触发WATCH-PARENT和浏览器URL更改。
如果成功,我会尝试在jsfiddle上重现并编辑这篇文章。
代码如下:
CHILD:
$scope.$watch('vars.model', function(newValue, oldValue) {
console.log('model changed');
$scope.$emit('highlightChange', newValue);
}, true);
PARENT:
$scope.$watch('vars.model.highlight', function(newValue, oldValue) {
console.log('highlight changed');
}, true);
$scope.$on('highlightChange', function(event, value) {
console.log('listener', $scope.vars.model.highlight.categoryId, value.categoryId);
$location.search('category-id', value.categoryId);
$scope.vars.model.highlight.categoryId = value.categoryId;
}
答案 0 :(得分:1)
下次请提供更多有效的代码,这样您就可以获得更好的答案。
这是我为测试您提供的代码而创建的Demo plunker。它工作得很好。如果你能提供更多代码,那么我们就能找到它无效的真正原因。
我创建了两个控制器 parentCtrl 和 childCtrl ,它们使用您提供的结构的代码和对象。
$scope.vars = {
model:{
highlight:{
categoryId : 5 //This value is set for testing purposes
}
}
};
此外,我将观看目标( vars.model - > vars.model.highlight )更改为与父控制器相同
$scope.$watch('vars.model.highlight', function(newValue, oldValue) {
console.log('child model changed (new/old)', newValue, oldValue);
$scope.$emit('highlightChange', newValue);
console.log('Emited change event');
}, true);
答案 1 :(得分:0)
感谢您的帮助。我发现我的事件源于对$ scope. $ digest()的手动调用,原因是来自daterangepicker" apply.daterangepicker'事件。 当我将其改为$ scope。$ apply时,问题似乎消失了。 我可以假设,只要有变化,$ apply()是负责持续调用$ watch的人,$ digest()不会这样做。
为了将来参考,我在这里提出了问题: https://plnkr.co/edit/ItkALhw16Aqukk3EFrRz?p=preview
$scope.digest();
应该成为
$scope.apply();