簡単な例。私にはプレイヤーがいます。それは2つのセクションに分かれています:曲のセクション(現在再生中)とプレイリストのセクション。AngularJSの異なるコントローラ間のやりとり方法
私は2つのコントローラを持っています(Actulally私は2つのコントローラを持っているので、私は尋ねています):SongCtrlとPlalistCtrl;
しかし、それらの間でやりとりする方法はありますか?たとえば、私が曲を演奏し始めるときには、それをプレイリストの中で強調表示する必要があります。
簡単な例。私にはプレイヤーがいます。それは2つのセクションに分かれています:曲のセクション(現在再生中)とプレイリストのセクション。AngularJSの異なるコントローラ間のやりとり方法
私は2つのコントローラを持っています(Actulally私は2つのコントローラを持っているので、私は尋ねています):SongCtrlとPlalistCtrl;
しかし、それらの間でやりとりする方法はありますか?たとえば、私が曲を演奏し始めるときには、それをプレイリストの中で強調表示する必要があります。
コントローラーをdirectives
またはservices
を使用して相互作用させることができます。あなたの例については
:あなたは、コントローラから直接DOMを変更することは避けるべきです。この特定のケースで
hen I start playing song I need also highlight it inside of playlist.
。たとえば、プレイリストで再生されている曲をハイライト表示するdirective
とすることができます。
これを行う最善の方法はサービスです。
.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>
あなたは他のコントローラでも同様にアクセスして現在の演奏曲。詳細がなければ、より具体的にするのは難しいですが、これがベストプラクティスのアプローチです。
ありがとう!私のプレーヤーのようです:D私は引数として2つの関数を持つ$ watch構文を知らないが、私は発見するだろう! – ValeriiVasin
どういう意味ですか?私はコントローラから何かを変更するつもりはない。そのためにng-classを使うつもりです。 – ValeriiVasin
これは実際に私が意図したことです、コントローラからjavascriptを追加するのではなく、 'ng-class'を使います。また、単一のコントローラを持つことを再考したい場合は、単純化します。あなたはまだ専用のサービスを持っている可能性があります(曲のためのものとプレイリストのためのもの) – Ulises
私はこのアプローチも好きです。それについて考えるでしょう。また、他の人が共有する方法 "Angular-way"を共有しています:)あなたの応答にも感謝します。 – ValeriiVasin