dae*_*s_j 16 javascript design-patterns javascript-framework backbone.js
我有一个问题,我认为是非常基本的东西但是:
我只看到了具有集合视图的示例,并且单个视图依赖于正在更新的集合.如果您有多个视图尝试订阅集合事件,例如reset,addOne,addAll等,该怎么办?
我是否错过了关于做/不这样做的一些观点?你有这方面的例子吗?这甚至有意义吗?
任何信息都非常感谢
var Coll = Backbone.Collection.extend({
model: SingleModel,
url: 'service',
initialize: function(){
console.log('collection inited')
}
});
var SingleModel = Backbone.Collection.extend({});
var CollView = Backbone.View.extend({
el: 'ul',
template: Handlebars.compile(someContainerTemplate),
init: function(){
_.bindAll(this, 'render', 'addAll', 'addOne');
this.collection.bind("reset", this.addAll);
this.collection.fetch();
},
render: function(){
$(this.el).append(this.template())
},
addAll: function(){
this.collection.each(this.addOne);
},
addOne: function(model){
var view = new SingleView({ model: model })
}
})
var SingleView = Backbone.View.extend({
tagName: "li",
events: {
"click .delete": "remove"
},
template: Handlebars.compile(someTemplateForSingleItem),
initialize: function() {
_.bindAll(this,'render');
this.model.bind('save', this.addOne);
this.model.bind('destroy', removeEl);
},
remove: function(){
this.model.destroy();
},
removeEl: function(){
$(this.el).remove();
},
render: function() {
var context = this.model.toJSON();
return $(this.el).append(this.template(context));
},
})
// standard so far (excluding any bad practices),
// but what if you have another view dependent on
// say the number of length of the collection, and
// you want it to update if any single models are destroyed
var HeaderView = Backbone.View.extend({
tagName: "div#header",
template: Handlebars.compile(someHeaderTemplate),
initialize: function() {
_.bindAll(this,'render');
this.model.bind('save', this.addOne);
},
render: function() {
//assigning this collection length
var context = this.collection.length;
return $(this.el).append(this.template(context));
},
});
var coll = new Coll();
new CollView({ collection: coll });
new HeaderView({ collection: coll});
Run Code Online (Sandbox Code Playgroud)
mu *_*ort 30
您正在做的事情非常好,也是使用Backbone的部分原因.从Backbone介绍:
每当UI动作导致模型的属性发生变化时,模型就会触发"更改"事件; 所有显示模型状态的视图都可以通知更改,
请注意,他们说"所有视图",而不是"视图".
单个集合的多个视图的一个示例是聊天系统.假设您有一组在线用户; 那么你可能在标题中有一个简单的视图,显示在线人数和另一个列出用户的视图(同一集合):
var User = Backbone.Model.extend({});
var OnlineUsers = Backbone.Collection.extend({
model: User
});
var CounterView = Backbone.View.extend({
tagName: 'span',
initialize: function() {
_.bindAll(this, 'render');
this.collection.on('add', this.render);
// other interesting events...
},
render: function() {
this.$el.text(this.collection.size());
return this;
}
});
var ListView = Backbone.View.extend({
initialize: function() {
_.bindAll(this, 'render');
this.collection.on('add', this.render);
// other interesting events...
},
render: function() {
var html = this.collection.map(function(m) {
return '<p>' + m.get('name') + '</p>';
});
this.$el.html(html.join(''));
return this;
}
});
Run Code Online (Sandbox Code Playgroud)
然后你有一个OnlineUsers实例,但你CounterView和ListView实例都会看着它.当人们上线或下线时,两个视图都将根据需要进行更新.
简单演示:http://jsfiddle.net/ambiguous/eX7gZ/
上面的示例情况听起来就像你正在做的事情,它正是Backbone的用途.做得好.
| 归档时间: |
|
| 查看次数: |
8934 次 |
| 最近记录: |