如何在第二次更改对象值时停止$ watch

时间:2017-02-01 10:24:50

标签: javascript jquery angularjs watch

如何在更改对象时停止$watch

这是$watch函数

$scope.$watch($scope.OneTime,function(old,new)
{
// my function
});
  

只要我的($watch)对象值发生了变化,上述OneTime函数就会触发。

但我不会在每次更改时都看到该对象,我只想在第一次上更改我的对象时触发$watch功能。

我也试过了一些东西并从angular.js脚本文件中找到了一个函数但是我不知道下面这个函数到底做了什么。

您可以从angular.js脚本文件中找到此功能

function oneTimeWatchDelegate(scope, listener, objectEquality, parsedExpression) {
                var unwatch, lastValue;
                return unwatch = scope.$watch(function oneTimeWatch(scope) {
                    return parsedExpression(scope);
                }, function oneTimeListener(value, old, scope) {
                    lastValue = value;
                    if (isFunction(listener)) {
                        listener.apply(this, arguments);
                    }
                    if (isDefined(value)) {
                        scope.$$postDigest(function () {
                            if (isDefined(lastValue)) {
                                unwatch();
                            }
                        });
                    }
                }, objectEquality);
            }

但是我在函数中看到一个漂亮的单词unwatch();。所以我认为我需要在$unwatch函数结束时使用$watch作为对象。但我无法在角度文档的任何地方获得关于$unwatch概念的任何信息。但我可以在角度脚本上看到它。

我对通过以下方式手动停止此$ watch功能有了一些想法

var unwatch = $scope.$watch("OneTime", function() {
    //...
});

setTimeout(function() {
    unwatch();
}, 1000);
  

但是我正在考虑角度是否提供给unwatch功能以阻止观看,我会在整个应用程序中轻松处理。 如此计划在我的应用程序中对angular.js文件中的覆盖内容进行覆盖。如果您对覆盖angular.js脚本文件有任何想法,请创建$unwatch函数与{{{ 1}}功能。并且让我知道angular有任何$watch功能。

2 个答案:

答案 0 :(得分:1)

AngularJS已经提供了这样的功能,正如您在上面提到的那样。当您创建观察者时,它会返回一个可用于停止观看的功能。

来自$rootScope.Scope documentation

  

<强> $watch(watchExpression, listener, [objectEquality]);

     

返回: function()返回此侦听器的注销功能。

你需要做的另一件事就是调用返回的函数。您可以在监视功能中调用它,以便在第一次调用观察程序时执行它。

var unwatch = null;

// start watching the object
var unwatch = $scope.$watch($scope.OneTime, function(old, new)
{
    // my function

    if (unwatch != null) {
        unwatch();
    }
});

答案 1 :(得分:1)

我认为你需要一种绑定方式

你可以实现这个目标

{{::oneTime}}

在你的html页面中一次性表达式会在稳定后停止重新计算,这在第一次摘要后发生

var $unwatch=$scope.$watch('onetime',function(){
unregister();
}