【发布时间】:2015-06-19 23:42:39
【问题描述】:
我正在尝试使 collectionView 工作,但我不确定 CollectionView 是否会自动启动 fetch 方法,然后用获取的数据填充 ChildViews。还是我需要手动做的事情?我检查了 Marionette 文档页面,但找不到任何可以回答我的问题的合适示例。
下面的例子是我目前得到的,集合中填满了所有需要的数据,但由于某种原因数据没有传递给 childview。
每当我调用“http://localhost/GetCategories”时,都会返回以下 JSON:
JSON 数据:
[{"category_id":"Category1","category_name":"Category One"},
{"category_id":"Category2","category_name":"Category Two"}]
收藏:
define([ 'underscore', 'backbone', 'models/MainMenu/MM.model.category'], function(_, Backbone, m_Category){
var CategoriesCollection = Backbone.Collection.extend({
model: m_Category,
url : 'GetCategories';
initialize: function() {
console.log('CategoriesCollection initialized...');
this.fetch()
}
});
return CategoriesCollection;
});
collectionView:
define([ 'backbone', 'underscore', 'marionette',
'collections/MainMenu/collection.categories' ,
'layouts/MainMenu/itemview.category'],
function (Backbone, _, Marionette, c_Categories, iv_Category) {
"use strict";
var CategoriesCollectionView = Marionette.CollectionView.extend({
tagName: 'div',
template: null,
id: 'categories',
childView: iv_Category,
collection : new c_Categories(),
initialize: function(){
console.log('Categories Collection: initialized');
/// or should I call fetch() from within the CV?
/// but how do I then pass all the data to ChildView?
this.collection.fetch().done(function(){
})
},
onRender: function(){
console.log(this.collection) ///<-- shows all the JSON data properly
},
onShow: function(){
}
});
return CategoriesCollectionView;
});
项目视图:
define([ 'backbone', 'underscore', 'marionette', 'templates/template.mainmenu'], function (Backbone, _, Marionette, template) {
"use strict";
var CategoryView = Marionette.ItemView.extend({
tagName: 'div',
template: template['category.layout'],
id: 'category-layout',
initialize: function(){
console.log('Category Layout: initialized');
},
onRender: function(){
console.log(this.model) /// < --- doesn't return anything
},
onShow: function(){
console.log(this.model) ///< --- doesn't return anything
}
});
return CategoryView;
});
它仅在我在 CollectionView 之上创建一个 LayoutView 并从那里处理获取和分配集合时才有效。
define([ 'backbone', 'underscore', 'marionette',
'templates/template.mainmenu',
'collections/MainMenu/MM.collection.categories',
'layouts/MainMenu/collectionview.categories' ],
function (Backbone, _, Marionette, template, c_Categories, cv_Categories) {
"use strict";
var CategoryLayoutView = Marionette.LayoutView.extend({
template: template['categories.layout'],
regions: {
categories : '#categories'
},
id: 'categories-layout',
initialize: function(options){
this.collection = new c_Categories();
console.log('Category Layout: initialized');
},
onRender: function(){
var categories = this.categories
var collection = this.collection;
collection.fetch().done(function(cData){
categories.show(new cv_Categories({collection : collection}))
})
},
onShow: function(){
}
});
return CategoryLayoutView;
});
任何帮助将不胜感激。
谢谢
【问题讨论】:
-
可以在CollectionView的initialize方法中试试this.collection = new c_Categories()吗?因为否则看起来还可以。顺便说一句,tagName: 'div' 是多余的,它是默认值。
-
也试过了,但结果是一样的:/
标签: javascript backbone.js marionette