AngularJS - 需要在控制器更改时清除javascript对象

时间:2016-05-05 17:31:47

标签: javascript html angularjs

我是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;
        }
    };
});

1 个答案:

答案 0 :(得分:0)

keyListeners目前是全球性的吗?如果是这样,那就是问题所在。切换屏幕时,当指令被炸毁时,它不会被垃圾收集。只需添加像...这样的东西。

var keyListenteners = {};

...在你的指令中。

或者,更好的是,将keyListeners移动到他们自己的服务或工厂并包含它。类似的东西:

angular.module("myApp").factory("keyListeners", function() {
    return {
      // your properties here
    };
});

这将像一个数据单例,有点像你的全局,在你的不同控制器之间。对一个人做出的改变将反映在其他人身上。当然这是你想要避免的问题,所以你可以在这个单例中添加clear()方法,并在每次路由更改时调用它,甚至在你的控制器构造函数中调用它。