状況
モデルとコレクションを使用して、ネストされたデータ構造の概要をレンダリングしようとしています。SubjectsCollection
特に、各サブジェクトにはいくつかの属性があり、そのうちの 1 つはネストされた であると想定されている をロードしていLessonsCollection
ます。
私のコントローラーはSubjectsCollection
. がSubjectsCollection
読み込まれると、コントローラーはSubjectListView
(a Marionette.CollectionView
) をレンダリングし、 aSubjectsCollection
に表示されMarionette.Region
ます。
SubjectModel
内のそれぞれが(a )SubjectListView
としてレンダリングされます。SubjectLayout
Marionette.Layout
がSubjectListView
に表示されるMarionette.Region
と、関数は を循環し、それぞれの (a ) でSubjectLayout
イベント ( package-definition:subject:layout:ready
)をトリガーし、受信するコールバックの引数としてを渡します。App.vent
Marionette.EventAggregator
SubjectLayout
SubjectLayout
望む効果
呼び出されたメソッドがイベントにopenLessons
反応し、 . これは複数回発生する必要があります (レンダリングされたものごとに 1 回)。package-definition:subject:layout:ready
LessonsCollection
SubjectLayout
それぞれLessonsCollection
が をレンダリングし、が属するの領域に表示LessonsListView
する必要があります。LessonsListView
SubjectLayout
SubjectsCollection
インスタンスはSubjectLayout
引数としてメソッドに渡されることになっているopenLessons
ため、対応する の割り当てられた領域にそれぞれLessonsListView
を表示できますSubjectLayout
。
コード
これまでに得たコードは次のとおりです。
var PackageDefinition_Overview_Controller = Controller.extend({
...
Data: {
packageDefinition: {
// attributes: {
// foo: 'bar',
// subjects: [{
// attributes: {
// baz: 'quux',
// lessons: []
// }
// }]
// }
}
},
// Initialization
//---------------
initialize: function() {
...
this.bindTo(App.vent, "package-definition:subject:layout:ready", this.openLessons);
},
...
openSubjects: function(packageDefinitionOverviewLayout) {
var that = this,
packageDefinition = packageDefinitionOverviewLayout.model;
packageDefinition_id = packageDefinition.get('id'),
subjects = packageDefinition.get('subjects') || new SubjectsCollection(),
subjectsRegion = packageDefinitionOverviewLayout.subjects;
...
subjects.load(packageDefinition_id);
...
subjects.isLoaded.done(function() {
packageDefinition.set({
subjects: subjects
});
that.showSubjectListView(subjectsRegion, subjects);
});
...
},
openLessons: function(subjectLayout) {
var that = this,
subject = subjectLayout.model;
subject_id = subject.get('id'),
lessons = subject.get('lessons') || new LessonsCollection(),
lessonsRegion = subjectLayout.lessons;
...
lessons.load(subject_id);
...
lessons.isLoaded.done(function() {
console.log('Data', that.Data);
subject.set({
lessons: lessons
});
that.showLessonsListView(lessonsRegion, lessons);
});
...
},
...
showSubjectListView: function(region, subjects) {
var subjectsListView = new SubjectsListView(subjects);
region.show(subjectsListView);
// Time to load the Lessons
subjectsLayouts = subjectsListView.children;
_.each(subjectsLayouts, function(subjectLayout) {
App.vent.trigger("package-definition:subject:layout:ready", subjectLayout);
}, this);
},
showLessonsListView: function(region, lessons) {
var lessonsListView = new LessonsListView(lessons);
region.show(lessonsListView);
}
});
問題
package-definition:subject:layout:ready
が複数回トリガーされ、複数LessonsCollection
がロードされるという事実にもかかわらず。最後だけがSubjectLayout
そのLessonsListView
.
また、各SubjectsCollection
'lessons' 属性には、最後LessonsCollection
に読み込まれたものが含まれます。
したがって、明らかにスコープの問題がここにあります。
質問
質問は次のとおりです。
SubjectsCollection
すべての「レッスン」属性が最後の で上書きされるのはなぜLessonsCollection
ですか?SubjectLayout
最後のインスタンスだけが を受け取るのはなぜLessonsListView
ですか?- 問題を解決するにはどうすればよいですか?