角度表未被解雇

时间:2017-11-13 07:43:17

标签: angularjs angularjs-controller angularjs-events

有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;
}

2 个答案:

答案 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();