【问题标题】:What $watch method in angularjs really returns and how it works?angularjs 中的 $watch 方法真正返回了什么以及它是如何工作的?
【发布时间】:2014-05-24 15:47:38
【问题描述】:

即使使用 cmets,我也很难理解以下代码

// Store the initial cell value so we can reset to it if need be
var oldCellValue;
var dereg = scope.$watch('ngModel', function() {
    oldCellValue = ngModel.$modelValue;
    dereg(); // only run this watch once, we don't want to overwrite our stored value when the input changes
});

在这种情况下,函数 dereg 被调用了多少次?这是递归吗?

【问题讨论】:

  • 这很容易找到,只需在代码中放置一个断点即可。
  • 你好,递归。递归,你好!
  • 这与递归无关。 (也就是说,实现似乎有问题,不太可能按预期工作。)
  • @ExpertSystem 确实如此。看了文档发现dereg跟watch方法本身没有关系,其实是watch方法返回的注销函数。

标签: javascript angularjs function watch


【解决方案1】:

你展示的代码很简单

  • 存储对的引用(刚刚添加)$watch()返回值(见下文$rootScope.$watch返回值)
  • 第一次是$watch() 调用,它调用引用function - 这导致$watch()ubinding

阅读这篇好文章

Unbinding $watch() Listeners In AngularJS

摘要中的一小段摘录:

如您所见,我们存储了$watch() 语句返回的函数引用;然后,一旦$watch() 触发几次,我们调用该存储方法,解除 $watch() 监听器的绑定。

在该示例中,有一个 if 语句,它可以帮助我们确定何时是删除 $watch() 的最佳时间(例如,在第一次评估之后)...

scope.$watch() 的更详细定义可以在这里找到:

正如我们从这段摘录中看到的那样:

$watch(watchExpression, [listener], [objectEquality]);

...
返回此侦听器的注销函数。

【讨论】:

  • 感谢您的回答,尤其是好文章!
  • 如果有帮助就太好了。这是一个不错的功能,您还可以检查 angular once github.com/tadeuszwojcik/angular-once,这是从中受益的扩展...一些只读属性可以只评估一次...并且可以删除 watch
  • +1,为了澄清:它存储了一个对删除新添加的观察者的函数的引用,因为这是 $watch 返回的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2021-04-05
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多