2016-07-14 8 views
2

私はを使用してコントローラから別のデータへのデータを$broadcastにしようとしています。

ng-clickのようなトリガを使用してブロードキャストする機能を実行すると、うまく動作するように見えますが、それはどうしたらいいですか?

フィドルで見ることができるように、私は$scope.cast機能のブロードキャストを持っていますので、このような機能を実行するとなぜ機能しません:$scope.cast();

フィドル:https://jsfiddle.net/kjgj7Ldz/19/

私は最初のコントローラにいくつかのデータを取得していますし、それが完了したときに、私は自動的にng-clickng-changeまたは任意の他のトリガーなしでそれを放送したいので、私はこれを必要とします。

$broaadcastこのシナリオでは間違ったことはありますか?もしそうなら、どうすればこれら2つのコントローラ間でデータ通信を行うことができますか?

+2

コントローラ2がまだ作成されていないためです。 –

+0

@ DanielA.Whiteだから私はコントローラ2で情報を受信する準備ができたらコントローラ1を発表する放送をする必要がありますか?コントローラ1がブロードキャストしますか? – Skkyp

+1

@Skkyp *データ通信*の意味に依存します。それはただのものでしょうか?あるいは、常にコミュニケーションを取る必要がありますか?放送するのではなく、まず* consumer *を読み込み、* producer *をロードしようとしますか?または、ある種の共有サービスでそのサイトを約束することができますか? 達成したいことを正確に知らなくても、最高のソリューションを提案することは難しいです。 – Chanthu

答えて

3

コミュニケーションチャネルを処理する簡単なpub-subサービスを作成することで、コントローラ間のコミュニケーションにスコープを使用することを避けることができます。例えば、それは、遅れた加入者のためにすべてのメッセージを配信することができる。 Demo

app.service('MQ', function() { 
    var listeners = [], 
    messages = []; 

    return { 
    pub: function(message) { 
     listeners.slice(0).forEach(function(listener) { 
     try { 
      listener(message) 
     } catch (ignored) { 
      console.log(ignored) 
     } 
     }) 

     // save message for late subscribers. 
     messages.push(message) 
    }, 
    sub: function(listener) { 
     // deliver all messages 
     messages.slice(0).forEach(function(message) { 
     try { 
      listener(message) 
     } catch (ignored) { 
      console.log(ignored) 
     } 
     }) 

     // save listener 
     listeners.push(listener) 

     // create unbinder 
     return function() { 
     listeners.splice(listeners.indexOf(listener), 1) 
     } 
    } 
    } 
}) 

app.controller('Controller1', ['$scope', 'MQ', function($scope, MQ) { 
    MQ.pub('John Snow') 

    $scope.cast = function() { 
    MQ.pub(Math.random()) 
    } 
}]); 

app.controller('Controller2', ['$scope', 'MQ', function($scope, MQ) { 
    var unsub = MQ.sub(function(message) { 
    $scope.message = message 
    }) 

    // clean-up bindings on scope destroy. 
    $scope.$on('$destroy', unsub) 
}]);