backbone.js无法渲染视图
backbone.js cannot render a view
下面是我的一个模块的代码。这是一种spagetti风格的代码,但我想要完成的只是拥有一个模型、一个集合,并呈现一个将数据从集合连接到视图的视图(使用下划线模板)。我失败得很惨。我遇到的问题是,试图运行对testfeed.render()的最后一个调用告诉我render不是一个函数,但它是明确定义的。我能够从api中获取数据并将其添加到集合中。我在这里做错了什么?
// Create a new module.
var Tagfeed = app.module();
// Default model.
Tagfeed.Model = Backbone.Model.extend({
defaults : {
name : '',
image : ''
},
initialize : function(){
console.log('tagfeed model is initialized');
this.on("change", function(){
console.log("An attribute has been changed");
});
}
});
var feedCollection = Backbone.Collection.extend({
model: Tagfeed.Model,
initialize : function () {
console.log('feedcollection is initialized');
},
fetch: function () {
var thisCollection = this;
Api_get('/api/test', function(data){
$.each(data.data, function(){
thisCollection.add(this);
});
return thisCollection;
})
}
});
var test = new Tagfeed.Model({name:'test'});
var newFeedCollection = new feedCollection();
newFeedCollection.fetch();
console.log(newFeedCollection.at(0));
var testfeed = Backbone.View.extend({
el: $('#main'),
collection : newFeedCollection,
render: function( event ){
var compiled_template = _.template( $("#tag-template").html() );
this.$el.html( compiled_template(this.model.toJSON()) );
return this; //recommended as this enables calls to be chained.
}
});
testfeed.render();
编辑*来自@mu的更新代码是简短的建议
// Create a new module.
var Tagfeed = app.module();
// Default model.
var tagModel = Backbone.Model.extend({
defaults : {
name : '',
image : '',
pins : 0,
repins : 0,
impressions : 0
},
initialize : function(){
console.log('tagfeed model is initialized');
this.on("change", function(){
console.log("An attribute has been changed");
});
}
});
var feedCollection = Backbone.Collection.extend({
model: tagModel,
initialize : function () {
console.log('feedcollection is initialized');
},
fetch: function () {
var thisCollection = this;
Api_get('/reporting/adlift/pin_details', function(data){
thisCollection.add(data.data);
return data.data;
})
}
});
var test = new tagModel({name:'test'});
var newFeedCollection = new feedCollection();
newFeedCollection.fetch();
console.log(newFeedCollection.at(0));
var TestFeed = Backbone.View.extend({
el: $('#main'),
render: function( event ){
console.log('here');
var compiled_template = _.template( $("#tag-template").html(), this.collection.toJSON());
this.el.html( compiled_template );
return this; //recommended as this enables calls to be chained.
},
initialize: function() {
console.log('initialize view');
this.collection.on('reset', this.render, this);
}
});
//Tagfeed.testfeed.prototype.render();
var testfeed = new TestFeed({ collection: newFeedCollection });
testfeed.render();
现在,当我运行testfeed.render()时,我没有看到任何错误,也没有在render函数中看到console.log。想法?
您的问题就在这里:
var testfeed = Backbone.View.extend({ /*...*/ });
testfeed.render();
这使您的testfeed
成为视图"类",您必须使用new
创建一个新实例,然后才能渲染它:
var TestFeed = Backbone.View.extend({ /*...*/ });
var testfeed = new TestFeed();
testfeed.render();
你也在"类"中这样做:
collection : newFeedCollection
这将把newFeedCollection
附加到该视图的每个实例,这可能会导致一些令人惊讶的行为。将集合放入视图的常用方法是将其传递给构造函数:
var TestFeed = Backbone.View.extend({ /* As usual but not collection in here... */ });
var testfeed = new TestFeed({ collection: newFeedCollection });
testfeed.render();
视图构造函数将自动将视图的this.collection
设置为构建视图时传递的集合。
另一件需要考虑的事情是:
newFeedCollection.fetch();
通常是AJAX调用,所以当你试图渲染它时,你的集合中可能没有任何东西
- 视图的
render
应该能够处理空集合。这主要取决于您的模板是否足够聪明,以便在集合为空时保持理智 在视图的
initialize
:中将render
绑定到集合的"reset"
事件initialize: function() { this.collection.on('reset', this.render, this); }
您将遇到的另一个问题是,视图的render
正试图渲染this.model
:
this.$el.html( compiled_template(this.model.toJSON()) );
当您的视图基于集合时;你想把它改成:
this.$el.html(compiled_template({ tags: this.collection.toJSON() }));
您需要tags
,以便在查看集合数据时模板有一个可参考的名称。
此外,您应该能够替换此:
$.each(data.data, function(){
thisCollection.add(this);
});
只有这个:
thisCollection.add(data.data);
不需要一个接一个地添加它们,Collection#add
对一系列模型非常满意。
这里有一个演示,(希望)一切都整理好了:
http://jsfiddle.net/ambiguous/WXddy/
我不得不伪造fetch
内部,但其他一切都应该在那里。
testfeed
不是实例,而是构造函数。
var instance = new testfeed();
instance.render();
可能会起作用(在View定义期间定义el
,使其成为原型属性IIRC)。
- angular.js没有'无法在PhoneGap中处理视图标记
- backbone.js无法渲染视图
- 在不破坏未定义函数的情况下,对多个视图使用单个js文件
- 有没有比在app.js上绑定模块名称更好的方法来动态加载视图模型和视图以显示模态
- 删除移动视图粘性js上的粘性导航栏
- Backbone.js将模型绑定到视图时出错
- 如何在渲染视图时将变量传递给Node.js中的脚本标记
- Backbone.js视图中的多个模型
- 带有jquery插件的backbone.js视图
- node.js/javascript/couchdb视图到关联数组似乎不起作用
- 使用knockout.js将数组绑定到视图模型
- 如何在主干js中解析视图中的消息
- 似乎无法将功能绑定到骨干网中的视图.js
- 嵌套依赖主干.js具有 require.js 主干的视图.js导致视图作为对象而不是函数加载
- 如何在主干中显示视图.js(路由器.js中不显示警报)
- 如何从主干中的视图呈现视图.js
- Extjs 4 -停止控制器试图加载视图js
- “this.model"不工作的点击视图.JS支柱
- MVC部分视图js文件不工作调试
- Rails3视图- JS模板目录结构