可以说我有一个男孩和女孩的名字的名单。这个名称集合还具有“性别”属性。Backbone.js:视图或集合可以具有属性吗?
我想在集合或视图上放置一个'SelectedGender'属性,以便只有在所选性别更改时才能触发自定义事件。
视图可以扩展为具有触发更改事件的属性吗?
一个Collection是否可以扩展为具有触发change事件的属性?
或者我不得不创建另一个包含集合的模型?我实际上没有代码,我现在只是在考虑设计。
可以说我有一个男孩和女孩的名字的名单。这个名称集合还具有“性别”属性。Backbone.js:视图或集合可以具有属性吗?
我想在集合或视图上放置一个'SelectedGender'属性,以便只有在所选性别更改时才能触发自定义事件。
视图可以扩展为具有触发更改事件的属性吗?
一个Collection是否可以扩展为具有触发change事件的属性?
或者我不得不创建另一个包含集合的模型?我实际上没有代码,我现在只是在考虑设计。
回答你的问题:可以扩展一个视图或集合,使其具有引发更改事件的属性,答案是否定的,是的。
不,你不能做view.set({attr: value})
或collection.set({attr: value})
可以,但是必须通过扩展Backbone.Events视图或收集火灾事件。
YourView = Backbone.View.extend({});
_.extend(YourView, Backbone.Events);
var view = new YourView();
view.bind('SelectedGenderChanged', function() {
console.log('SelectedGenderChanged event fired!');
});
//somewhere else in your code
view.trigger('SelectedGenderChanged');
但是,可能有更好的方法来设计它。
如果在用户从组合框中进行选择时选定的性别会发生变化,那么您可以在视图中订阅组合框更改事件,然后让您的视图进行当时需要完成的任何更改。
我不认为你需要为你的集合创建包装模型。只需创建一个存储名称和性别的模型。然后,像@Paul提到的那样,您可以订阅集合中或视图中的更改事件。
var nameModel = Backbone.Model.extend({
defaults : function() {
return {
name : "Andy",
gender : "male"
};
}
});
var nameCollection = Backbone.Collection.extend({
initialize : function (args) {
var self = this;
self.model.bind("change:gender", function() {
self.changeGender(self.model.get("gender"));
});
},
changeGender : function(gender) {
// modify your collection somehow
}
});
var nameView = Backbone.View.extend({
initialize : function(args) {
var self = this;
self.model.bind("change:gender", function() {
self.changeGender(self.model.get("gender"));
});
// in case you have a checkbox or something you want to bind the model change to:
self.$(".genderCheckbox").bind("change", function(ev) {
self.model.set({ gender, self.$(".genderCheckbox").val() });
});
},
changeGender : function(gender) {
// Modify your view here
}
});
编辑:
而不是具有取决于名字的性别2点独立的集合,为什么没有与该返回刚才那个男孩的名字,并返回一个方法的方法名的一个集合只是女孩的名字?
即:
getMaleNames : function() {
return this.filter(function(name) {
return name.get('gender') == "male";
});
}
我并没有真正改变个人模特的性别。在你的例子中,安迪永远是男性。我可能会将选择框更改为Andrea,一位女性。我正在寻找的答案是“添加一个属性,将事件更改引发到一个集合中,您必须将它包装在模型中。”我可以创建另一个模型,并在视图上使用2个模型,但包装收藏最适合我。 – ctrlShiftBryan 2012-01-06 16:06:16
在此示例中,默认模型将为男性,但只要您想要更改性别,就可以通过发布model.set({gender:“female”})轻松完成此操作。视图和集合都可以访问模型。 查看活动中的自我$(“。genderCheckbox”)。在你的例子中,这会将模型上的性别属性设置为女性,并且属性更改会触发将调用collection.changeGender和view.changeGender的更改事件。那有意义吗? – stinkycheeseman 2012-01-06 16:29:16
感谢。看起来我真正需要做的是为我的集合创建Wrapper模型,然后我可以将属性放在这些模型上。 – ctrlShiftBryan 2012-01-06 15:24:55