リストのリストを結合したリストを表示しようとしています。
私のモデル
ムービーをライブラリにリンクする 2 つの hasMany リレーションを取得しました
+---------+ hasMany +---------+ hasMany +-------+
| Library | ---------> | Storage | ---------> | Movie |
+---------+ +---------+ +-------+
Javascript :
App.Library = DS.Model.extend({
name : DS.attr(),
storages : DS.hasMany('storage', {async:true})
});
App.Storage = DS.Model.extend({
hostname : DS.attr(),
login : DS.attr(),
password : DS.attr(),
name : DS.attr(),
movies: DS.hasMany('movie', {async:true})
});
App.Movie = DS.Model.extend({
name: DS.attr()
duration : DS.attr()
});
ライブラリは私の AppController にロードされます:
App.ApplicationController = Ember.Controller.extend({
data: function() {
return this.get('store').find('library', 1);
}.property()
});
問題
私がやろうとしているのは、ライブラリのすべての映画のリストを名前順に表示することです。私はそのようなことを試しましたが、うまくいきません:
App.LibraryController = Ember.ArrayController.extend({
needs: ['application'],
sortProperties : [ 'name' ],
sortAscending : true,
model: function() {
var storages = this.get('controllers.application.data.storages');
if (storages) {
return storages.mapBy('cpls').reduce(function(accum, items) {
return accum.pushObjects(items);
}, Ember.ArrayController.create({}));
}
else {
return [];
}
}.property('controllers.application.data.storages.@each')
});
しかし、このアプローチにはいくつかの問題があります。
- 明らかに、それは機能していません
- 1 つのムービーが追加または削除された場合、1 つのエントリを変更するだけでなく、配列全体を再構築する必要があります。
- プロパティは依存する必要がありますが
controllers.application.data.storages.@each.movies.@each
、EmberJS は @each の後にセレクターを追加することをサポートしていません (計算されたプロパティの末尾にある注を参照し、 @each を使用してデータを集計します) 。
ここでいくつかの指針が必要です。この問題を適切に解決する方法を知っている人はいますか?
編集 :
私の問題に関連するこの要点を見つけました複数のソース配列からのアイテムを結合するEmber.jsでのマージされた配列の実装