调用后在angularjs中取消绑定$ watch

时间:2013-10-16 02:17:37

标签: javascript angularjs frameworks

我知道你可以解开像这样的$ watch:

var listener = $scope.$watch("tag", function () {});
// ...
listener(); // would clear the watch

但您可以在监视功能声明中取消绑定手表吗?因此,在手表执行一次后,它会自行解除绑定吗?类似的东西:

$scope.$watch("tag", function () {
    unbindme()
});

5 个答案:

答案 0 :(得分:58)

你可以像现在这样做,在你的功能中调用“注销”:

var unbind = $scope.$watch("tag", function () {
    // ...
    unbind();
});

答案 1 :(得分:9)

由于tag是一个表达式,因此您可以在收到值后使用one-time binding取消绑定:

$scope.$watch("::tag", function () {});



angular
.module('app', [])
.controller('example', function($scope, $interval) {
  $scope.tag = undefined
  $scope.$watch('::tag', function(tag) {
    $scope.tagAsSeen = tag
  })
  $interval(function() {
    $scope.tag = angular.isDefined($scope.tag) ? $scope.tag + 1 : 1
  }, 1000)
})
angular.bootstrap(document, ['app'])

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.0/angular.min.js"></script>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body ng-controller="example">
Tag: {{tag}}
<br>
Watch once result: {{tagAsSeen}}
</body>
</html>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

bindonce指令可能就是你需要的。

https://github.com/Pasvaz/bindonce

答案 3 :(得分:0)

var unbindMe=$scope.$watch('tag',function(newValue){
    if(newValue){
       unbindMe()
    }
})

答案 4 :(得分:0)

就像https://ideone.com/PT6vvy一样,对@Kris的回答稍作改进将使您在整个项目中更时尚,更可重用。

.run(function($rootScope) {
    $rootScope.see = function(v, func) {
        var unbind = this.$watch(v, function() {
            unbind();
            func.apply(this, arguments);
        });
    };
})

现在由于作用域原型继承,您可以轻松进行

$scope.see('tag', function() {
    //your code
});

完全不用担心解除绑定。