【问题标题】:How to stop $watch when change the object vlaue on second time第二次更改对象值时如何停止$watch
【发布时间】:2017-02-01 19:21:27
【问题描述】:

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

这是一个$watch函数

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

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

但我不会在每次更改时观察对象,我只想在仅在第一次更改对象时触发$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();。所以我想我需要在$watch 函数结束时使用$unwatch 作为对象。但是我在 Angular 文档中的任何地方都找不到关于 $unwatch 概念的任何信息。但我可以在角度脚本上看到它。

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

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

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

但是我正在考虑如果 angular 提供给unwatch 函数来停止观看,这将很容易在我的整个应用程序中处理。 因此计划在我的应用程序中覆盖 angular.js 文件中的某些内容。 如果您对覆盖 angular.js 脚本文件以创建与 $watch 函数相同的 $unwatch 函数有任何想法,请告诉我.并且还让我知道 Angular 有任何$unwatch 功能。

【问题讨论】:

  • 当 Angular 已经允许您注销观察者时,$unwatch 函数的意义何在?
  • $scope.$watch的返回值作为函数(var unwatch; unwatch = $scope.$watch('foo',function(){unwatch()}))调用,取消监视。 $watch 函数的原始实例化已经返回了您正在寻找的“$unwatch”函数。这有意义吗?

标签: javascript jquery angularjs watch


【解决方案1】:

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

你可以做到这一点 br

{{::oneTime}}

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

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

【讨论】:

  • 请看我可以更改值,但我不会触发 $watch 函数。我打算在 angular.js 脚本文件中编写一些代码来创建 $unwatch 函数,如 $watch
  • 您需要在角度原型中添加,如果您可以添加该功能,那么您只需调用 unregister();停止观看该变量。
【解决方案2】:

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

来自$rootScope.Scope documentation

$watch(watchExpression, listener, [objectEquality]);

返回: function() 返回此侦听器的注销函数。


取消监视对象唯一需要做的就是调用返回的函数。您可以在 watch 函数中调用它,以便在第一次调用 watcher 时执行它。

var unwatch = null;

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

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

【讨论】:

  • AngularJS does already provide such function。这就是为什么我在这里问。我们要不要在 angular 脚本上添加这个函数?因为使用我的整个应用程序会很舒服。
  • 如果 AngularJS 已经为您提供了它,我不明白您为什么要添加它。为了让你有一些不看的东西,你首先需要看它,这就是为什么当前的实现给你这个函数作为你的 watch 调用的返回。
  • 你可以在你的 watch 函数中调用unwatch(),这样它就会在你的 watcher 第一次被调用时被执行。我会将其添加到我的答案中。
猜你喜欢
  • 2015-09-03
  • 2021-07-31
  • 2015-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 2020-12-26
相关资源
最近更新 更多