Javascript 角度$watch oldvalue在$destroy之后保存

Javascript 角度$watch oldvalue在$destroy之后保存,javascript,angularjs,scope,watch,destroy,Javascript,Angularjs,Scope,Watch,Destroy,我使用的是Angular 1.4.7 我有一个角度指令,有时用ngIf开关关闭 在指令中,我让它监视对服务中对象的更改 我遇到的问题是,在ngIf被切换为false,然后又返回true之后,指令的作用域应该有效地重置 但是,在$scope为$destroy-ed之后,$watch中的“oldVal”将被维护。因此,当ngIf变为真实后$scope重新存在时,$watch逻辑始终无法看到$destroy-ed之前和之后的任何变化。换句话说,新值与旧值相同,但旧值应为null或未定义的值。当然,尽管

我使用的是Angular 1.4.7

我有一个角度指令,有时用ngIf开关关闭

在指令中,我让它监视对服务中对象的更改

我遇到的问题是,在ngIf被切换为false,然后又返回true之后,指令的作用域应该有效地重置

但是,在$scope为$destroy-ed之后,$watch中的“oldVal”将被维护。因此,当ngIf变为真实后$scope重新存在时,$watch逻辑始终无法看到$destroy-ed之前和之后的任何变化。换句话说,新值与旧值相同,但旧值应为null或未定义的值。当然,尽管它不能判断$scope是$destroy-ed,但手表正在处理和填充的本地数据是空的

如果我没有执行新旧值比较的检查,那么手表会频繁触发额外的逻辑

为什么即使在$scope被$destroy删除之后,仍然要维护'oldVal',我能做些什么来强制清除它吗

var module = angular.module('SeFarmFieldsList', ['ui.router']);
module.directive('seFarmFieldsList', 
    ['FarmSvc','MapSvc','FormSvc','UtilSvc',
    function(FarmSvc, MapSvc, FormSvc, UtilSvc) {
        return {
            restrict: 'E',
            replace: false,
            transclude: false,
            scope: {},
            templateUrl: '/views/directives/seFarmFieldsList.html',
            link: function($scope,elem,attributes) {
                console.log('Starting Directive [Farm Fields List]');
                //========== INIT ===================================
                $scope.selFarm = {};
                $scope.fieldListDisplay = [];
                $scope.selFieldId;
                //========= WATCHES ==================================
                $scope.$on('$destroy', function handleDestroyEvent() {
                    console.log('[Farm Fields List] DESTROYED!!!!!!');
                    watch_getSelFarm();
                });

                var watch_getSelFarm = $scope.$watch(
                    function () { 
                        return FarmSvc.getSelFarm();
                        }, 
                    function (newVal, oldVal) {
                        if (!newVal) { return false;}
                        if (newVal === oldVal) { return false; } // <- HERE!
                        $scope.selFarm = newVal;
                        $scope.selFieldId = FarmSvc.getSelFieldId();
                        if (!($scope.selFarm.fields)) { return false; }
                        doStuff();
                    }, true);

[...]
var module=angular.module('SeFarmFieldsList',['ui.router']);
模块指令('seFarmFieldsList',
['FarmSvc'、'MapSvc'、'FormSvc'、'UtilSvc',
函数(FarmSvc、MapSvc、FormSvc、UtilSvc){
返回{
限制:'E',
替换:false,
排除:错误,
作用域:{},
templateUrl:“/views/directives/seFarmFieldsList.html”,
链接:函数($scope、elem、attributes){
log('Starting指令[farmfields List]”);
//=============INIT===================================
$scope.selFarm={};
$scope.fieldListDisplay=[];
$scope.selFieldId;
//=============手表==================================
$scope.$on(“$destroy”,函数handleDestroyEvent()){
console.log(“[农田列表]已销毁!!!”);
观察自己的手臂();
});
var watch_getSelFarm=$scope.$watch(
函数(){
返回FarmSvc.getSelFarm();
}, 
函数(newVal、oldVal){
如果(!newVal){return false;}

如果(newVal==oldVal){return false;}//我从来没有像您在查看服务值时那样使用过
$watch
er,而不是实际的
$scope
上的某个内容,但对我来说,这看起来有点可疑。这可能是在触发watcher回调缓存值之前对newVal和oldVal进行检查的某种底层机制吗e来自以前的指令实例?另外,
true
作为调用
$watch
的第三个参数可能与我以前的评论有关。查看文档-您可能会尝试将其设置为false?嗨,jusopi,感谢您的输入!服务变量上的$watch有什么“可疑”之处?我确实尝试禁用了“deep”刚才,正如你所建议的,通过将最后一个值设置为false进行观察,但结果是相同的-newval仍然等于oldval。当第一次调用观察者时,angular将旧值设置为与第一个观察值相同的值。tasseKATT-啊,我在文档中找到了它。我已经阅读了它,但我没有真正“理解”它,而是使用了you说,我重读了几遍,现在我明白了。在文档中:“[…]在向作用域注册了观察者之后,异步调用侦听器fn(通过$evalAsync)来初始化观察者[…]”因此,在$watch启动后,不管watch表达式是否为true,都会调用侦听器一次,这将准备oldVal。如果您(tasseKATT)将此作为答案提交,我会将其标记为这样。