可以說我有一個男孩和女孩的名字的名單。這個名稱集合還具有「性別」屬性。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