2016-11-09 15 views
1

私は単純なことをやろうとしています。角1.5非親コンポーネント間通信

受信者と呼ばれる子コンポーネント以外のコンポーネントにメッセージを送信したい送信者というコンポーネントがあります。送信側は受信側コンポーネントを見つけ、その属性値を変更します。

残念ながら、レシーバコンポーネントは属性が変更されたことを認識しません。

これが完了すると、同じ受信コンポーネントインスタンスを使用する複数の送信コンポーネントが存在するため、子コンポーネントにする必要はありません。

受信コンポーネントに新しい属性値が認識されるようにするにはどうすればよいですか?

ここplunkr

HTMLです:

<!DOCTYPE html> 
<html> 
    <head> 
    <script data-require="[email protected]" data-semver="1.5.8" 
      src="https://code.angularjs.org/1.5.8/angular.js"></script> 
    <link rel="stylesheet" href="style.css" /> 
    <script src="https://code.angularjs.org/1.5.8/angular.js"></script> 
    </head> 
    <body> 
    <h1>Test sending values to a component from a non-parent component</h1> 
    <sender id="SendingComponent"></sender> 
    <h2>past send tag</h2> 
    <receiver id="ToComponent" textvalue="defaultvalue"></receiver> 
    <h2>Past receiver tag</h2> 
    <script src="script.js"></script> 
    </body> 
</html> 

はJavascript:あなたの代わりにイベントで作業しなければならないよう

var app = angular.module('app',[]) 
    .component("sender", { 
    template: "<div> I send messages to receiver. 
     Receiver should say 'a new sent value'.</div>", 
    controller: [function() { 
     var ctrl = this; 
     ctrl.$oninit = function() { 
     var receiver = document.getElementById('ToComponent'); 
     receiver.attributes.setNamedItem('textvalue', 'a new sent value'); 
     $timeout(function() { $scope.apply();}); 
    }; 
    }]}) 
    .component("receiver", { 
    template: '<div>I received this message: 
     {{receiverCtrl.textvalue}}</div>', 
    bindings: { 
     textvalue: '<' // using '@' makes the default value work, 
         // but is described as a one time bind 
    }, 
    controllerAs: 'receiverCtrl', 
    controller: [function() { 
     var ctrl = this; 
     ctrl.$onChanges = function (changesObj) { 
     if (changesObj.textvalue !== undefined) { 
      ctrl.textvalue = changesObj.textvalue.currentValue; 
     } 
     } 
    }] 
}); 

angular.bootstrap(document, ['app']); 

答えて

1

は私にね。おそらく、あなたの送信者が変更される値$broadcastになり、あなたの受信者はそのイベントを聞いて、その値で何が行われる必要があるかを行います。

これには、送信者がメッセージを送信するためにDOMを操作する必要がないという利点もあります。この方法では、必要に応じてDOM操作をレシーバにだけ残します。

+0

これで問題は解決しました。 $ rootscope。$ broadcastは、コンポーネントが完全に実装されたバージョンのどこにあるかによって選択されました。 このトピックを読んでいるうちに、このgithubコードへの参照が見つかりました。より効率的かもしれません(元のコメントごとに追跡しました)。確認はしていませんが、リンクは次のとおりです:https://github.com/georapbox/angular-PubSub –

関連する問題