2017-07-05 16 views
0

ファクトリを使用してネストされたビューの2つの異なるコントローラ間で通信するプランカを作成しました。以下はプランカのURLです。 https://plnkr.co/edit/fWA2Xugjbkf3QvHKfTa0?p=preview。 ここは工場です。工場を使用して2つのコントローラの間で通信する

routerApp.factory("widgetService",function($state){ 
    var callbackFunctions=[]; 
    var counter=0; 

    var addWidget=function(name){ 
     callbackFunctions[0](name); 
    } 

    var addCallback=function(callback){ 
     if (callbackFunctions.length===0) { 
      callbackFunctions.push(callback); 
     } 
    } 
    return{ 
     addCallback: addCallback, 
     addWidget: addWidget 
    } 
}) 

シナリオ1:ホームページの下の "リスト" メニューで 1.をクリックします。 2.「確認」ボタンをクリックします。強調表示された領域の変更が黄色で表示されます。テキストが「Chandan」から「singh1」に変わります。 3.もう一度[確認]ボタンをクリックします。テキストは "singh1"から "singh2"に変わります。だから私はこれで2つのコントローラ間で通信することができます。

シナリオ2: 1.シナリオ1を手順2まで繰り返します。 2.ホームページの下にある「PARAGRAPH」メニューをクリックします。 3.ホームページの下にある「リスト」メニューをクリックします。確認ボタンをクリックします。テキストは変更されません。それは "ちゃんとした"ままです。 状態を変更すると通信が機能しません。

また、私はモデルが変化しているのを観察しましたが、同じものは視野に反映されていません。さらに、ビューをrootscopeにバインドすると、ビューが更新されます。 明確にしてください。

答えて

0

リストと段落の状態を切り替えると、リストコントローラーが破棄されます(次にリストに移動するときに再作成されます)。だからそれが再現されるとき、それは新しい範囲を取得します。

あなたのサービスに登録されているcallbackFunctionは、あなたがあなたのサービスでaddWidget()を呼び出すたびので、あなたが実際にあなたの古いスコープでコールバックを呼び出している、古いコントローラスコープにchangeMyName()機能をいいます。

(少なくともここのサンプルコードでは)期待どおりに動作させるには、addCallback()関数で古いコールバックを変更できるようにサービスを変更する必要があります。このようなもの:

var addCallback=function(callback){ 
    callbackFunctions[0] = callback; 
} 
+0

ありがとうNikolaj。出来た。 – ckmind

+0

あなたが役に立つと分かっていれば、投票し、回答としてマークしてください。 –

+0

私はその理由を知らせることができます、それは古いコントローラのスコープに登録されているときにchangeMyName()関数が呼び出されます。私はそれを投票しました – ckmind

関連する問題