【问题标题】:When to use $watch in AngularJS何时在 AngularJS 中使用 $watch
【发布时间】:2014-07-02 10:07:03
【问题描述】:

如果AngularJS自动为每个创建的模型(ng-model)创建一个手表,我需要知道为什么要使用$watch函数。

(当我说模型时,我指的是控制器中声明的值,如 `$scope.value = "somethign" edit-> 由 {{}} 附加到视图或ng-模型)

我的猜测是:

1) 当检测到模型发生变化时,创建复杂的操作很有用。不只是改变视图中的值。

2) 它用于将观察者添加到未作为模型与视图绑定的值。 (这可以解决,但这是一个好习惯吗?)

这只是我的猜测,我想知道我是否正确。

另外,如果有任何使用 $watch 的高级方法,请告诉。

谢谢。

【问题讨论】:

    标签: javascript angularjs controller watch


    【解决方案1】:

    正如你所说,Angular 为屏幕上的每个绑定创建一个 $watch。这包括ng-model{{ ... }}(以及ng-repeat 和其他指令)。

    您希望何时创建自己的 $watch 函数?

    您的第一个猜测是正确的。如果在模型更改时需要运行一些代码,则需要对其进行监视。

    假设您有一个显示一些图表的指令,并且该指令通过属性接收一些数据。这个想法是在新数据到达时进行一些计算。你是怎样做的?你需要观察这些数据。当数据发生变化时,$watch 会触发并由您进行计算,然后更新 DOM。

    查看示例here

    您的第二点也很有用。 $watch 可以返回任何类型的代码,例如..

    $scope.$watch(function() { return service.foo; }, function() { ... });
    

    所以如果服务上的foo 发生变化,$watch 就会触发。在某些用例上可以派上用场。

    【讨论】:

    • 我还有一个问题,耶稣。如前所述,当观察者自动添加到摘要中时会发生什么,但随后用户将另一个观察者添加到同一变量中。这对摘要循环性能是否有害?
    • 任何 $watch 都会为页面添加性能命中。 100 块手表不会受伤,也许 1000 块也不会受伤,你只需要让你的手表快,AKA 不给他们繁重的任务。您可以将任意数量的手表添加到变量中,它们都会运行。在您的情况下,您可以拥有一个 ng-model 的 $watch ,但也可以在其上使用另一个 watch 以在该模型更改时触发某些事情。
    【解决方案2】:

    AngularJS 不会自动创建监视函数,除非你(隐含地)告诉它这样做。这些隐式方法是通过以表达式语言将其添加到模板中或在指令中使用它。

    此外,$scope.$watch 函数对于在值更改时运行一段代码非常有用。我不明白为什么应该将观察者添加到未绑定到视图的值。这通常会随着函数或当它被另一个正在监视的值触发时发生变化。这将是使用 $scope.$watch 的好例子。

    在这个 SO-question 中阅读更多关于 AngularJS 的摘要循环以及 $watch 和 $apply 函数的信息: How do I use $scope.$watch and $scope.$apply in AngularJS?

    【讨论】:

    • 对不起,当我说手表自动添加到摘要循环时,我并不是根据我给出的模型定义,我是指ng-models . "value" 被添加到了 diggest 循环中,不是吗?
    • 好吧,在您对它进行操作之前,它不必一直查看输入字段。也就是说,当您在另一个函数中使用模型时,或者触发链接到该字段的操作时。检查从 Angular 文档中采用的以下 plunkr:plnkr.co/edit/JKj1MoXKMdumesiT2DhP?p=preview。如果您没有观察 ng-models 变化的事件,它们的连接值不会改变。
    • 我不完全同意耶稣的回答,它并没有隐含地看 ng-model,你可以在 plunkr 中找到。除此之外,比我的更好更完整的答案。
    • 耶稣是对的,当我说“..view by {{}} OR ng-model”时,我错了。这不是 OR,而是 AND。在他的评论中,耶稣说“BOTH”,而在 plunker 中没有 ng-model="greeting",这就是为什么它没有自动添加到摘要循环中的原因。也许如果他删除“...screen”和“That”之间的点(.),它会更有意义。
    • 关于abc 示例。你不能那样做。 ab 在 ng-model 更改时会更新,这是肯定的。问题是:c 正在使用对a 的引用+ 对b 的引用,它返回一些值。当您更改任何 ng-model 时,对 ab 的引用会更改,c 仍指向旧引用,因此,它看不到任何更改。当然,这些变化正在改变这些引用,c 跟不上。您可以使用每次都会使用新引用的“函数”:plnkr.co/edit/BGuMZ2tOj171N4TjjpLK?p=preview 或...
    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    相关资源
    最近更新 更多