2016-05-05 5 views
0

私はAngularJsを初めて使用しています。現在私は、keyListenersというJavaScriptオブジェクトに値を設定する命令を持っています。このオブジェクトは、使用されたページに初めてアクセスしたときに、そのオブジェクトに値が設定され、その目的がうまく機能します。残念ながら、私はページから移動して、それに戻って、私はAngularJS - コントローラの変更時にJavaScriptオブジェクトを消去する必要があります

ように私のコンソールにエラーが表示来るとき「angular.min.js:116複数のamtAltKeyがキー 『A』が見つかり、」

ページの機能が中断し始めます。

私は理論的に、オブジェクトにオブジェクトを追加する前に、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

keyListenersは現在グローバルですか?もしそうなら、それが問題です。これは、画面を切り替えるときに指示が爆発したときにガベージコレクションされません。次のようなものを追加してください。

var keyListenteners = {}; 

...をあなたの指示に追加してください。

また、keyListenersを独自のサービスまたはファクトリに移動して組み込むことをお勧めします。何かのように:

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

これは、あなたの異なるコントローラ間であなたのグローバルのようなデータシングルトンのように動作します。 1つの変更は他の変更に反映されます。あなたが避けたいのはもちろんのことなので、このシングルトンにclear()メソッドを追加し、ルートが変更されるたびに、またはコントローラコンストラクタでも呼び出すことができます。

+0

ディレクティブに追加する点では、amt-alt-key属性でマークした各要素でこの問題が発生することがあります。これらのそれぞれをkeyListeners {}に追加します。ですから、指示の始めにそれをクリアすることはできません。 --Jason –

+0

OK。次に、それらの間でサービスや工場を共有したいとします(上記の2番目の例)。これに追加された項目は、ディレクティブがなくなっても有効になりますので、ルータに応じて好きなようにクリアまたは永続化することができます。 – oooyaya

関連する問題