【问题标题】:How do I stop $watching in AngularJS?如何在 AngularJS 中停止 $watching?
【发布时间】:2013-03-30 06:24:24
【问题描述】:

我可以在 AngularJS 范围内设置一个 $watch,以便在我感兴趣的表达式发生更改时收到通知。但是,一旦我失去兴趣,我该如何停止观看呢?

【问题讨论】:

    标签: angularjs angularjs-scope


    【解决方案1】:

    当调用$watch 时,会返回一个取消注册绑定表达式的函数。

    例如,观察变量foo 只更改一次:

    var unregister = $scope.$watch('foo', function () {
      // Do something interesting here ...
      unregister();
    });
    

    希望有所帮助:-)

    【讨论】:

    • 明确一点:在上面的例子中,'unregister' 回调是从 watch 函数本身调用的。不必如此,应用程序中其他地方的代码(即 watch 函数之外)可以愉快地调用它,以确保 watch 函数不再被调用。
    • 另外注意:当你注册一个手表时,它会立即运行一次,然后每次值变化时再运行一次。因此,上面的确切代码将运行一次 watcher-function,然后在它对foo 中的任何更改做出反应之前取消注册它。有点离题,但我认为值得一提。
    【解决方案2】:

    作为附加评论,但不回答 - 这也是杀死事件侦听器的相同原则。

    var unregister = $rootScope.$on("listen-for-something-cool", function($event, params) {
       //Do cool stuff with params, then kill it
       unregister();
    };
    

    只是我认为其他人知道会很酷的一个补充......

    【讨论】:

      【解决方案3】:

      我不确定接受的答案是如何工作的!对我来说,它根本不起作用。

      我使用的是 $watchCollection 而不是 $watch。然后我尝试将其更改为 $watch 并应用接受的答案但无处可去!

      唯一对我有用的是:

      var watchFoo = $scope.$watch('foo', function () {
        // Do something interesting here ...
      
          return;
      });
      

      return; 正在注销手表并打破手表循环。即使在循环中断后它也能正常工作。它能够检测到对 Array 所做的更改。

      我的代码看起来像:

      var watchFoo = $scope.$watchCollection('foo', function (newFoo, oldFoo) {
          
           if(condition) {
               // Do something interesting here ...      
                return;
           } else {
               // Do something else here ...
           }
           
          });
      

      如果对你有用,可以使用接受的答案,否则这个答案会派上用场!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-14
        • 2018-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多