如何从指令元素中删除角度观察者
How to remove angular watcher from directive element?
我有一个指令,看起来像这样:
app.directive('mydirective', function($compile,$document){
var directive = {
restrict: 'EA',
scope:{
},
link: link,
};
return directive;
function link(scope, element, attr) {
var template_html = "<div id='"popup'">{{popupTitle}}</div>";
var template = angular.element(template_html);
element.bind('click', function(){
if(!$("#popup").is(':visible')){
var $popup = $compile(template)(scope);
$document.find('body').append($popup);
}else{
$("#popup").remove();
}
});
template.remove();
}
});
当单击mydirective
时,显示和删除弹出元素的代码运行良好。但是,问题是每当元素显示&隐藏,角度观察者只是不断增加。观察者数量的增加取决于template_html
中绑定的数量。
当弹出窗口被删除时,我如何才能让这些观察者被删除,这样观察者就不会随着时间的推移而增加。
在删除弹出窗口时,您是否尝试过销毁else块内的作用域?
element.bind('click', function(){
if(!$("#popup").is(':visible')){
var $popup = $compile(template)(scope);
$document.find('body').append($popup);
}else{
$("#popup").remove();
scope.$destroy();
}
});
要创建一个新的范围,你可以做一些类似的事情
var popupScope;
element.bind('click', function(){
if(!$("#popup").is(':visible')){
popupScope = $scope.$new();
var $popup = $compile(template)(popupScope);
$document.find('body').append($popup);
}else{
$("#popup").remove();
popupScope.$destory();
}
});
将watcher
作为变量存储在控制器中:
var myWatcher = $scope.$watch(......
确保你的控制器可以从你的指令中访问,然后你可以调用myWatcher()
,它将解除你的观察程序的绑定,因为调用watch
将返回一个未绑定的函数。
相关文章:
- 未激发路由的控制器属性上的观察者
- 将属性设置为未定义时未通知观察者
- 检测 DIV 的高度何时变化,而无需轮询或突变观察者
- JavaScript:为什么Addy's观察者模式
- 设置多个观察程序以触发动态事件的角度替代解决方案 - 优化的观察者模式
- 被动.js模式间接观察者报告相同的值
- 将$scope对象作为参数提供给$digest中的观察者背后的逻辑
- 取代了棱角分明的深度观察者
- 突变观察者尚未定义
- 突变观察者未能检测到元素's删除dom
- 手动调整元素大小;不要在Chrome中激发突变观察者
- 共同描述编译器和观察者
- 如何确保对观察者的订阅调用最初接收到最新的值
- 未捕获的类型错误:无法执行'观察'在'突变观察者':参数1不是'节点'
- 在jQuery数据表中使用AngularJS观察者的方法是什么
- nodejs:原子文件替换操作,只触发一次一些观察者
- 阵列突变而不触发特定的观察者
- 无限循环当观察父对象时,观察者不更新任何值
- Angularjs - $scope.$destroy 不会删除观察者
- 如何从指令元素中删除角度观察者