2016-03-29 5 views
1

2つのコントローラを作成しました.1つは実際のページ用、もう1つは成功モード用です。私はモーダルコントローラーからでも放送しており、ページコントローラーでも聞いています。スコープ変数の現在のインスタンスを参照するために 'this'を使用しています。しかし、$ onリスナーでは、スコープ変数を使用しようとするたびにnullが見つかるため、ページコントローラ変数を変更することはできません。モーダルコントローラで

$rootScope.$on('backToFetch', function() { 
      for(var i=0; i < this.fetchUploader.documentData.length; i++) { 
       this.fetchUploader.documentData[i].isSuccess = false; 
       this.fetchUploader.progress = 0; 
      } 
      deleteFormFields() 
     }); 

:ページコントローラで

​​

私はあなたがスコープの状態をコピーすることができ

+0

どの範囲ですか?アプリケーションにスコープがたくさんある可能性があります – Dalorzo

+0

これが達成しようとしているのであれば 'this'を使って '$ scope'を使わないのはなぜですか? –

+0

通常、イベントにデータを送信します。 '$ rootScope。$ broadcast( 'backToFetch'、function(e、data){});' $ rootScope。$ broadcast( 'backToFetch'、 'Some extra data');そしてあなたのハンドラでそのデータを受け取ります。データは何でもかまいません。またコントローラ間の階層は何か、 '$ rootScope'を汚染する必要はないでしょう。 – ste2425

答えて

0

リスナーの$内側のスコープ変数の参照を取得できますかevent argumentsに、このように:

$rootScope.$broadcast('backToFetch', { 
    scope: angular.extend($scope, {}) 
}); 

そして、あなたは今、それはとても似た値です読み取ることができます。

$rootScope.$on('backToFetch', function(event, args) { 
    console.log(args.scope); 
}); 

これはあなたの元のコントローラの範囲を変更しません。 1つのコントローラが別のコントローラの範囲を直接変更すべきではないので、そのような操作はイベントの使用によって実行されるべきである。

は、第二に、あなたはコピーのみの引数はスコープ、からあなたが必要とするは、全体の範囲をコピーすることは行き過ぎ-bad練習かもしれなければなりません。

+0

あなたが提案した方法は、放送コントローラの値を変更するのに役立ちますが、この放送を聞いているコントローラの値を変更する必要があります。スコープはリスナー内でnullになります。 –

+0

それでは、リスナから別のイベントを送信しないでください。それはソースコントローラによって捕捉されますか?この件については、こちらをご覧ください:http://stackoverflow.com/questions/28806321/angularjs-can-i-change-scope-value-of-a-controller-from-another-controller – Beri