* 更新 :请参阅下面最后一个代码块中的最终答案代码。 *
目前我在集合视图中显示集合时遇到问题。该集合是现有模型的属性,如此(伪代码)
ApplicationVersion { Id: 1, VersionName: "", ApplicationCategories[] }
所以基本上ApplicationVersion有一个名为ApplicationCategories的属性,它是一个javascript数组。目前,当我渲染与ApplicationCategories相关联的集合视图时,不会呈现任何内容。如果我在Chrome的javascript调试器中调试,似乎尚未填充类别(因此我假设还没有提取ApplicationVersion)。这是我目前的代码
ApplicationCategory模型,集合和视图
ApplicationModule.ApplicationCategory = Backbone.Model.extend({
urlRoot:"/applicationcategories"
});
ApplicationModule.ApplicationCategories = Recruit.Collection.extend({
url:"/applicationcategories",
model:ApplicationModule.ApplicationCategory,
initialize: function(){
/*
* By default backbone does not bind the collection change event to the comparator
* for performance reasons. I am choosing to not preoptimize though and do the
* binding. This may need to change later if performance becomes an issue.
* See https://github.com/documentcloud/backbone/issues/689
*
* Note also this is only nescessary for the default sort. By using the
* SortableCollectionMixin in other sorting methods, we do the binding
* there as well.
*/
this.on("change", this.sort);
},
comparator: function(applicationCategory) {
return applicationCategory.get("order");
},
byName: function() {
return this.sortedBy(function(applicationCategory) {
return applicationCategory.get("name");
});
}
});
_.extend(ApplicationModule.ApplicationCategories.prototype, SortableCollectionMixin);
ApplicationModule.ApplicationCategoryView = Recruit.ItemView.extend({
template:"application/applicationcategory-view-template"
});
ApplicationModule.ApplicationCategoriesView = Recruit.CollectionView.extend({
itemView:ApplicationModule.ApplicationCategoryView
});
ApplicationCategory模板
<section id="<%=name%>">
<%=order%>
</section>
ApplicationVersion模型,集合和视图
ApplicationModule.ApplicationVersion = Backbone.Model.extend({
urlRoot:"/applicationversions"
});
ApplicationModule.ApplicationVersions = Recruit.Collection.extend({
url:"/applicationversions",
model:ApplicationModule.ApplicationVersion
});
ApplicationModule.ApplicationVersionLayout = Recruit.Layout.extend({
template:"application/applicationversion-view-template",
regions: {
applicationVersionHeader: "#applicationVersionHeader",
applicationVersionCategories: "#applicationVersionCategories",
applicationVersionFooter: "#applicationVersionFooter"
}
});
ApplicationModule.ApplicationVersionController = {
showApplicationVersion: function (applicationVersionId) {
ApplicationModule.applicationVersion = new ApplicationModule.ApplicationVersion({id : applicationVersionId});
var applicationVersionLayout = new Recruit.ApplicationModule.ApplicationVersionLayout({
model:ApplicationModule.applicationVersion
});
ApplicationModule.applicationVersion.fetch({success: function(){
var applicationVersionCategories = new Recruit.ApplicationModule.ApplicationCategoriesView({
collection: ApplicationModule.applicationVersion.application_categories
});
applicationVersionLayout.applicationVersionCategories.show(applicationVersionCategories);
}});
// Fake server responds to the request
ApplicationModule.server.respond();
Recruit.layout.main.show(applicationVersionLayout);
}
};
这是我的ApplicationVersion模板
<section id="applicationVersionOuterSection">
<header id="applicationVersionHeader">
Your Application Header <%= id %>
</header>
<section id="applicationVersionCategories">
</section>
<footer id="applicationVersionFooter">
Your footer
</footer>
有一点需要注意我正在使用Sinon来模拟我的服务器响应,但我不认为这会导致问题,因为它正在响应信息,因为我期望通过javascript调试器查看(就像我说的那样)正确显示ApplicationVersion id)。如果有帮助,我也可以提供此代码
它当前正在显示应用程序版本ID(模板中的id),因此我知道它正在为正常属性正确获取数据,它只是不呈现我的ApplicationCategories javascript数组属性。
所以最终我绑定了ApplicationVersion的获取成功,然后设置了ApplicationCategories的视图。因为这不像我预期的那样工作,我想知道是否有更好的方法来创建这个集合视图?
感谢您的帮助
更新:Derek Bailey带领我的工作代码示例。
ApplicationModule.ApplicationVersionController = {
showApplicationVersion: function (applicationVersionId) {
ApplicationModule.applicationVersion = new ApplicationModule.ApplicationVersion({id : applicationVersionId});
var applicationVersionLayout = new Recruit.ApplicationModule.ApplicationVersionLayout({
model:ApplicationModule.applicationVersion
});
ApplicationModule.applicationVersion.fetch();
// Fake server responds to the request
ApplicationModule.server.respond();
Recruit.layout.main.show(applicationVersionLayout);
var applicationVersionCategories = new Recruit.ApplicationModule.ApplicationCategoriesView({
collection: new Backbone.Collection(ApplicationModule.applicationVersion.get('application_categories'))
});
applicationVersionLayout.applicationVersionCategories.show(applicationVersionCategories);
}
};
答案 0 :(得分:8)
Marionette的CollectionView需要一个有效的Backbone.Collection,而不是一个简单的数组。在将数组传递给视图时,需要从数组中创建Backbone.Collection:
new MyView({
collection: new Backbone.Collection(MyModel.Something.ArrayOfThings)
});