情况
我正在尝试使用模型和集合呈现嵌套数据结构的概述。特别是,我正在加载一个SubjectsCollection
,其中每个主题都有一些属性,其中一个应该是嵌套的LessonsCollection
.
我的控制器加载SubjectsCollection
. 一旦SubjectsCollection
加载了 ,控制器就会渲染一个SubjectListView
(a Marionette.CollectionView
),SubjectsCollection
并显示在 a 中Marionette.Region
。
中的每个SubjectModel
都SubjectListView
呈现为SubjectLayout
(a Marionette.Layout
)。
一旦SubjectListView
显示在 中Marionette.Region
,函数就会循环遍历并在(a ) 上为每个SubjectLayout
触发一个事件 ( ) ,将作为参数传递给要接收的任何回调。package-definition:subject:layout:ready
App.vent
Marionette.EventAggregator
SubjectLayout
SubjectLayout
想要的效果
一个被调用的方法openLessons
对事件做出反应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
被触发多次,并且 multipleLessonsCollection
被加载。只有最后一个SubjectLayout
收到它的LessonsListView
.
此外,每个SubjectsCollection
“课程”属性都包含最后LessonsCollection
加载的内容。
所以很明显这里有一个范围界定问题。
问题
问题是:
- 为什么所有人
SubjectsCollection
都会用 last 覆盖他们的“课程”属性LessonsCollection
? - 为什么只有最后一个
SubjectLayout
实例收到一个LessonsListView
? - 我该如何解决问题?