Angularjs - $scope.$destroy 不会删除观察者

Angularjs - $scope.$destroy doesn't remove watchers

本文关键字:删除 观察者 destroy scope Angularjs      更新时间:2023-09-26

我正在尝试弄清楚如何为Angularjs <= 1.2创建自己的"一次性绑定"。我找到了这个答案,描述了如何创建自己的绑定一次指令。在使用以下指令时,我确实看到了这一点:

    app.directive('bindOnce', function() {
    return {
            scope: true,
            link: function( $scope ) {
                setTimeout(function() {
                    $scope.$destroy();
                }, 0);
            }
        }
    });

数据绑定一次。但是,我可以看到 $watchers 美元仍在。看看下面的 JSBin - 在控制台上运行注释的观察者计数代码将显示观察者仍然活着。

编辑:由于某种原因,当对 angular 1.3 使用相同的指令时,观察者计数 dod 更改为 0!!

使用 cleanup 函数删除观察程序:

function cleanup(element) 
  { 
  element.off().removeData();
  var injector = currentSpec.$injector;
  element.$injector = null;
  // clean up jquery's fragment cache
  angular.forEach(angular.element.fragments, function(val, key) {
    delete angular.element.fragments[key];
  });
  angular.forEach(angular.callbacks, function(val, key) 
    {
    delete angular.callbacks[key];
    });
  angular.callbacks.counter = 0;
  }

使用自毁服务作为简单绑定一次:

function onetime()
  {
  /*...*/
  onetime = Function;
  }
angular.module('myApp').constant('bindonce', onetime);
angular.module('myApp').controller('foo', function($bindonce){
  this.$inject = '$bindonce';
  $scope.mybind = $bindonce();
} 

使用迁移指南作为参考来查找重大更改:

引用

  • 可测试性补丁.js

  • 棱角分明的嘲讽.js

  • AngularJS 开发人员指南:从以前的版本迁移