我是AngularJs的新手。目前,我有一个指令,用于填充名为keyListeners
的JavaScript对象。现在这个对象被填充,并且在我第一次到达使用它的页面时,它的用途很好。不幸的是,当我离开页面然后回到它时,我在控制台中看到错误,如
“angular.min.js:116找到关键字'A'的多个amtAltKey”
然后页面的功能开始中断。
我知道在将它添加到对象之前,理论上我可以在keyListeners中检查元素是否存在。但是,我没有这样做,而是想运行一些逻辑来清除控件更改中的keyListeners。我的指令实际上填充了keyListeners,如下所示。每次控制器/页面更改时,如何清除它。
app.directive("amtAltKey", function () {
return {
link: function (scope, elem, attrs) {
var altKey = attrs.amtAltKey.toUpperCase();
if(keyListeners[altKey] !== undefined) { throw 'More than one amtAltKey found for key \''+ altKey + '\''; }
if (altKey === '') { throw "Alt Key value key must be given"; }
var el = elem[0];
if (!el.hasChildNodes()) { throw 'amtAltKey element must have child text'; }
if(el.firstChild.nodeName !== '#text') { throw 'amtAltKey element\'s child must be text'; }
var text = el.innerText;
var textUpper = text.toUpperCase();
var indexOfKey = textUpper.indexOf(altKey);
if (indexOfKey === -1) { throw 'amtAltKey for \'' + altKey + '\' was not found in element\s text; ' + text; }
var newText = text.replace(new RegExp(attrs.amtAltKey), '<u>' + attrs.amtAltKey + '</u>');
el.innerHTML = newText;
keyListeners[altKey] = el;
}
};
});
答案 0 :(得分:0)
keyListeners目前是全球性的吗?如果是这样,那就是问题所在。切换屏幕时,当指令被炸毁时,它不会被垃圾收集。只需添加像...这样的东西。
var keyListenteners = {};
...在你的指令中。
或者,更好的是,将keyListeners移动到他们自己的服务或工厂并包含它。类似的东西:
angular.module("myApp").factory("keyListeners", function() {
return {
// your properties here
};
});
这将像一个数据单例,有点像你的全局,在你的不同控制器之间。对一个人做出的改变将反映在其他人身上。当然这是你想要避免的问题,所以你可以在这个单例中添加clear()
方法,并在每次路由更改时调用它,甚至在你的控制器构造函数中调用它。