今天是我backbone.js
的第一天,所以在这里轻松一下。
我有一个view
,一个collection
和一个model
来填充select
。
我可以使用硬编码 select
来填充array
罚款。但是我使用的是现有的API,我需要先解析响应。这似乎也可行。
我不知道的是告诉我们为了呈现我新返回的结果/模型而改变了什么...代码应该更有意义如果这没有帮助。< / p>
var UserGroup = Backbone.Model.extend();
var UserGroups = Backbone.Collection.extend({
initialize:function(){
this.fetch();
},
model: UserGroup,
url: "http://myAPI/getUserGroups",
parse: function(json){
return json["GetUserGroups"]["Results"];
}
});
var GroupSelectView = Backbone.View.extend({
el: $("select"),
initialize: function() {
var that = this;
this.collection = new UserGroups();
this.render();
},
render: function(){
_.each(this.collection.models, function(group){
$("<option/>", { value: group.get("Id"), text: group.get("Name")} ).appendTo(this.el)
}, this);
},
});
var groupSelectView = new GroupSelectView();
你觉得怎么样?我明白了吗?
答案 0 :(得分:3)
为了更加灵活,您可以倾听reset
和add
个事件。
当您reset
来自服务器(或本地),但是fetch
模型或add
使用fetch
选项时,该集合为add
,而是触发了每个模型的添加事件。
这应该有效:
var GroupSelectView = Backbone.View.extend({
initialize: function() {
var that = this;
this.setElement($("select"));
this.collection = new UserGroups();
// listen to add and reset events but handle them differently
// fired on collection.add(model) and collection.fetch({add: true})
this.collection.on("add", this.renderItem, this);
// fired on collection.fetch()
this.collection.on("reset", this.render, this);
},
render: function(){
// backbone collections already come with some underscore methods built in
this.collection.each(this.renderItem, this);
},
renderItem: function(group) {
this.$el.append($("<option/>", {
value: group.get("Id"),
text: group.get("Name")})
);
}
});
答案 1 :(得分:1)
您可以执行以下操作...
var GroupSelectView = Backbone.View.extend({
el: $("select"),
initialize: function() {
var that = this;
this.collection = new UserGroups();
this.collection.on( 'change', this.render, this );
// You could try this too, 1 is for 1 item is added, the other, when all items are changed
// this.postCollection.on('add', this.addOne, this);
// this.postCollection.on('reset', this.addAll, this);
this.render();
},
render: function(){
_.each(this.collection.models, function(group){
$("<option/>", { value: group.get("Id"), text: group.get("Name")} ).appendTo(this.el)
}, this);
},
});
答案 2 :(得分:0)
您可以使用Backbone.Events发布/订阅更改。请点击链接获取更多信息。
模型和集合具有针对常见用例触发的内置事件,例如模型的属性变更('更改')和集合的模型获取('重置')。
触发更改(发布):
myObject.trigger( '事件');
订阅更改(订阅者)
myObject.on('event',myCallback,context);
将myCallback设置为视图的渲染方法。
查看this post以获取有关Backbone Events的更多详细信息。