2017-04-11 14 views
0

私はAngularにとって本当に新しく、特定の状況があります。私はモデル作成の仕方を理解していません。サブコンポーネントの特定のインスタンスと通信する角度1.5のコンポーネントですか?

私はmainコンポーネントがあります。

<div> 
    ... 
    <map name="foo"> 
    ... 
    <map name="bar"> 
    ... 
</div> 

mapコンポーネントは、このようなものになります:

angular 
    .module('synthApp') 
    .component('main', { 
    templateUrl: 'app/components/main.template.html', 
    controller: MainController 
    }); 

function MainController() { 
    ... 
} 

そのmain.template.htmlファイルは、私が持っている別のコンポーネント、mapコンポーネントの2つのインスタンスが含まれていますが

angular 
    .module('synthApp') 
    .component('map', { 
    templateUrl: 'app/components/map.template.html', 
    controller: MapController, 
    bindings: { 
     name: '=' 
    } 
    }); 

function MapController() { 
    var $ctrl = this; 

    $ctrl.addMarker = function(coords, classId, popupMarkup) { 
    ... 
    }; 

    $ctrl.removeMarkers = function() { 
    ... 
    }; 
} 

mainのメソッドはfoo mapの場合はaddMarkerをコールしなければならず、それ以外の場合はbarマップの場合はaddMarkerを呼び出す必要があります。

サブコンポーネントの特定のインスタンスと通信する親コンポーネントのベストプラクティスは何ですか?

答えて

1

親ディレクトリに$ rootScope $ emit( 'nameOfInstance'、message)を設定し、子インスタンスが$ rootScope。 'nameOfInstance'、機能(メッセージ){})

<div> 
    ... 
    <map name="foo" event-name="instance1" > 
    ... 
    <map name="bar" event-name="instance2" > 
    ... 
</div> 

とコンポーネントでちょうど追加:面白い

bindings: { 
     name: '=', 
     eventName : '@' 
    } 

function MapController(){ 
    var $ctrl = this; 
    $rootScope.$on($ctrl.eventName, function(dataFromParent) { 
    // do stuff based on message 
    }) 
} 
+0

うーんを...それは簡単ですが、私はそれがどのようにスケーラブル思ったんだけど...なぜなら、イベント名を 'addMarker'、' removeMarkers'、そして将来のメソッドにバインドする必要があるからです。 – carmenism

+1

チャネルパターンを使用すると、それは一種のスケールになります。あなたはトピック、ユーザー、製品ごとにチャネルを持つことができます。 Jsbin(例:https://jsbin.com/letiti/edit?html,js,console,output) –

関連する問題