我知道你可以解开像这样的$ watch:
var listener = $scope.$watch("tag", function () {});
// ...
listener(); // would clear the watch
但您可以在监视功能声明中取消绑定手表吗?因此,在手表执行一次后,它会自行解除绑定吗?类似的东西:
$scope.$watch("tag", function () {
unbindme()
});
答案 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;
答案 2 :(得分:1)
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
});
完全不用担心解除绑定。