如何在$ watch中调用函数?

时间:2017-05-31 13:05:16

标签: javascript angularjs

当内容更改时,我在角度指令中观察运行frame.sly(" reload")函数。

但是我应该立即这样做,现在在内容更改后,console.log看起来像这样。

日志 日志(2) 日志(3) 日志(4) 记录(5)......

每次调用frame.sly(" reload")的次数越来越多。

scope.$watch(

  function () {
     return scope.value;
  },

  function (newValue, oldValue) {
     if (!angular.equals(oldValue, newValue)) {
          $timeout(function() {
              console.log("Log");    
              frame.sly("reload");
          }, 300)
     }

}  ,true);

有什么想法吗? 提前谢谢。

3 个答案:

答案 0 :(得分:1)

You can deregister $watch like this:

var watcher = scope.$watch(

  function () {
     return scope.value;
  },

  function (newValue, oldValue) {
     if (!angular.equals(oldValue, newValue)) {
          $timeout(function() {
              console.log("Log");    
              frame.sly("reload");
              watcher();
          }, 300)
     }

}  ,true);

答案 1 :(得分:0)

There's a easy way to do it

var watchVariable= $scope.$watch("Watcher", function () {
// ...
watchVariable();
});

This is called as de-registration

答案 2 :(得分:0)

您可以添加var watchCalled = false变量之类的内容,并在手表调用一次时将此值更改为true

var watchCalled = false;

scope.$watch('variableToWatch', function(newValue, oldValue) {
  if (!watchCalled) {
    function () {
      return scope.value;
    }

    function (newValue, oldValue) {
      if (!angular.equals(oldValue, newValue)) {
        $timeout(function () {
          console.log("Log");
          frame.sly("reload");
          scopeCalled = true;
        }, 300)
      }
    }
  }
}, true);