2013-02-20 12 views
6

簡単な例。私にはプレイヤーがいます。それは2つのセクションに分かれています:曲のセクション(現在再生中)とプレイリストのセクション。AngularJSの異なるコントローラ間のやりとり方法

私は2つのコントローラを持っています(Actulally私は2つのコントローラを持っているので、私は尋ねています):SongCtrlとPlalistCtrl;

しかし、それらの間でやりとりする方法はありますか?たとえば、私が曲を演奏し始めるときには、それをプレイリストの中で強調表示する必要があります。

答えて

1

コントローラーをdirectivesまたはservicesを使用して相互作用させることができます。あなたの例については

:あなたは、コントローラから直接DOMを変更することは避けるべきです。この特定のケースで

hen I start playing song I need also highlight it inside of playlist. 

。たとえば、プレイリストで再生されている曲をハイライト表示するdirectiveとすることができます。

+0

どういう意味ですか?私はコントローラから何かを変更するつもりはない。そのためにng-classを使うつもりです。 – ValeriiVasin

+0

これは実際に私が意図したことです、コントローラからjavascriptを追加するのではなく、 'ng-class'を使います。また、単一のコントローラを持つことを再考したい場合は、単純化します。あなたはまだ専用のサービスを持っている可能性があります(曲のためのものとプレイリストのためのもの) – Ulises

+0

私はこのアプローチも好きです。それについて考えるでしょう。また、他の人が共有する方法 "Angular-way"を共有しています:)あなたの応答にも感謝します。 – ValeriiVasin

9

これを行う最善の方法はサービスです。

.factory('musicPlayer', function() { 
    var currentSongId; 

    // public API 
    return { 
    getCurrentSong: function() { return currentSongId; }, 
    setCurrentSong: function (id) { currentSongId = id; } 
    }; 
}); 

あなたは、あなたのプレイリストにこれを使用することができます:あなたは(簡易オーバー)の曲を再生するための責任サービスを持っているとしましょう

.controller('PlaylistCtrl', function ($scope, musicPlayer) { 
    $scope.isCurrentSong = function(idx) { 
    if ($scope.currentSong == idx) return true; 
    }; 

    $scope.play = function(idx) { 
    musicPlayer.setCurrentSong(idx); 
    }; 

    $scope.$watch(function() { 
    return musicPlayer.getCurrentSong() 
    }, function (id) { 
    $scope.currentSong = id; 
    }); 
}); 

だからあなたの見ることができ、アクセス

それ:

<li ng-repeat="song in songs" ng-class="{ active: isCurrentSong($index) }"> 
    <a ng-click="play($index)">{{song.name}}</a> 
</li> 

あなたは他のコントローラでも同様にアクセスして現在の演奏曲。詳細がなければ、より具体的にするのは難しいですが、これがベストプラクティスのアプローチです。

+0

ありがとう!私のプレーヤーのようです:D私は引数として2つの関数を持つ$ watch構文を知らないが、私は発見するだろう! – ValeriiVasin

関連する問題