【问题标题】:How to delete functions of previous instances of controller?如何删除控制器以前实例的功能?
【发布时间】:2015-09-04 12:07:34
【问题描述】:

我有一个简单的 angularjs 控制器,引用为 someCtrl,它包含以下代码:

function testing() {
    console.log("Hello there.");
}

$document.on('click', function(e) {
    testing();
});

this.getView = function(value) {
    return viewService.getView(value);
};

this.setView = function(value) {
    viewService.setView (value);
};

this.destroy = function() {
    $state.reload('default_state');
};

当点击事件发生时,testing() 函数执行并且一些东西被记录到控制台。后来我的默认 viewA 使用 service 和 ng-show 指令更改为 viewB:

<div ng-show="someCtrl.getView('viewA')">
   Content
</div>

<div ng-show="someCtrl.getView('viewB')">
    <a ng-click="someCtrl.setView('viewA'); someCtrl.destroy();">go to viewA</a>
</div>

然后,当点击事件发生时,如果我一次又一次地改变视图,testing() 函数每次点击执行两次甚至更多次......为什么会发生这种情况?控制器的两个实例是否存在? $state.reload 不会杀死一个控制器实例的属性吗?我真的很感激一些帮助:)

【问题讨论】:

    标签: javascript angularjs controller state reload


    【解决方案1】:

    事件不会自动从 DOM 中清除,尽管它们是从控制器附加的。您可以通过确保事件仅绑定一次来做到这一点。你可以先unbind它然后再绑定它。

    代码

    $document.unbind('click');//ensure it will bind once
    $document.bind('click', function(e) {
        testing();
    });
    

    更具体地说,您不应该使用 click 文档事件,那么您应该通过执行 click.testing 来命名您的事件,然后您的代码看起来会更智能。因为有时您执行$document.unbind('click') 会从document 中删除click 事件

    更新

    代码

    $document.unbind('click.custom');//ensure it will bind once
    $document.bind('click.custom', function(e) {
        testing();
    });
    

    注意

    将 DOM 事件侦听器放在 Angular 控制器中的错误做法, 更好地创建一个可以扩展此功能的控制器。

    【讨论】:

      猜你喜欢
      • 2018-01-15
      • 2023-03-14
      • 2023-04-03
      • 2013-01-19
      • 2016-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多