如何删除以前控制器实例的功能?
How to delete functions of previous instances of controller?
我有一个简单的 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 使用服务和 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 不会杀死一个控制器实例的属性吗?我真的很感激一些帮助:)
事件不会从 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();
});
NOTE
Bad practice to put DOM event listeners inside angular controller,
better create a controller that would extend this functionality.
我有一个简单的 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 使用服务和 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 不会杀死一个控制器实例的属性吗?我真的很感激一些帮助:)
事件不会从 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();
});
NOTE
Bad practice to put DOM event listeners inside angular controller, better create a controller that would extend this functionality.