Как правильно отобразить представление коллекции Backbone марионеток на основе свойства массива модели javascript?
*UPDATE: See final answer code in the last code block below.*
В настоящее время у меня возникла проблема с отображением коллекции в виде коллекции. Коллекция является свойством существующей модели, например, так (псевдокод)
ApplicationVersion { Id: 1, VersionName: "", ApplicationCategories[] }
Таким образом, по существу, ApplicationVersion имеет свойство ApplicationCategories, которое представляет собой массив javascript. В настоящее время, когда я отображаю представление коллекции, связанное с ApplicationCategories, ничего не отображается. Если я отлаживаю в отладчике JavaScript Chrome, кажется, что категории еще не заполнены (поэтому я предполагаю, что 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
});
Шаблон приложенияКатегория
<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 идентификатор правильно). Я могу также предоставить этот код, если это поможет
В настоящее время он отображает идентификатор версии приложения (идентификатор в шаблоне), поэтому я знаю, что он правильно выбирает данные для обычных свойств, просто он не отображает свойство массива javascript ApplicationCategories.
Так что в конечном итоге я привязываюсь к успеху выборки для ApplicationVersion, а затем настраиваю представление для ApplicationCategories. Так как это работает не так, как я ожидал, мне интересно, есть ли лучший способ создать это представление коллекции?
Спасибо за любую помощь
UPDATE: Working code example that Derek Bailey lead me too.
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);
}
};