【问题标题】:angular watch not fired角表未开火
【发布时间】:2017-11-13 07:43:17
【问题描述】:

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

【问题讨论】:

  • 知道我做错了什么吗?:不,因为你没有发布任何代码。不要描述你的代码。发布它。
  • @yinonby 我没听错,你想听子变量变化吗?

标签: angularjs angularjs-controller angularjs-events


【解决方案1】:

下次请提供更多有效的代码,这样您可以获得更好的答案。

这是我创建的Demo plunker,用于测试您提供的代码。它工作得很好。如果你能提供更多代码,那么我们就能找到它不起作用的真正原因。

我创建了两个控制器 parentCtrlchildCtrl 使用您的代码和提供的结构对象。

$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);

【讨论】:

    【解决方案2】:

    感谢您的帮助。我发现我的事件源自对 $scope.$digest() 的手动调用,因为原始事件是从 daterangepicker 'apply.daterangepicker' 事件触发的。 当我将其更改为 $scope.$apply 时,问题似乎消失了。 我可以由此假设,只要有变化,$apply() 就是负责调用 $watch 的那个,而 $digest() 不会这样做。

    为了将来参考,我把问题放在这里: https://plnkr.co/edit/ItkALhw16Aqukk3EFrRz?p=preview

    $scope.digest();
    

    应该变成

    $scope.apply();
    

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 2021-08-25
      • 1970-01-01
      • 2016-09-17
      • 2017-05-20
      • 2021-01-19
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      相关资源
      最近更新 更多