有 1 个 Angular 应用程序,带有 1 个父控制器和一个子控制器。在 child 中,有 1 个 $watch WATCH-CHILD 用于 OBJ-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 从未被触发(即使值已更改),以及在浏览器 URL 中设置的 $location 属性未更改(我知道它们确实在 JavaScript 中更改,因为我打印它们)。
为了确保在 $digest 中调用 ON-LISTENER,我尝试在 ON-LISTENER 结束时调用 $digest,并得到了预期的异常。
知道我做错了什么吗?我希望 ON-LISTENER 中发生的更改会触发 WATCH-PARENT 和浏览器 URL 更改。
如果成功,我将尝试在 jsfiddle 上重现并编辑这篇文章。
代码如下所示:
孩子:
$scope.$watch('vars.model', function(newValue, oldValue) {
console.log('model changed');
$scope.$emit('highlightChange', newValue);
}, true);
家长:
$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;
}