2012-01-06 34 views
1

可以說我有一個男孩和女孩的名字的名單。這個名稱集合還具有「性別」屬性。Backbone.js:視圖或集合可以具有屬性嗎?

我想在集合或視圖上放置一個'SelectedGender'屬性,以便只有在所選性別更改時才能觸發自定義事件。

視圖可以擴展爲具有觸發更改事件的屬性嗎?

一個Collection是否可以擴展爲具有觸發change事件的屬性?

或者我不得不創建另一個包含集合的模型?我實際上沒有代碼,我現在只是在考慮設計。

回答

4

回答你的問題:可以擴展一個視圖或集合,使其具有引發更改事件的屬性,答案是否定的,是的。

不,你不能做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'); 

但是,可能有更好的方法來設計它。

如果在用戶從組合框中進行選擇時選定的性別會發生變化,那麼您可以在視圖中訂閱組合框更改事件,然後讓您的視圖進行當時需要完成的任何更改。

+0

感謝。看起來我真正需要做的是爲我的集合創建Wrapper模型,然後我可以將屬性放在這些模型上。 – ctrlShiftBryan 2012-01-06 15:24:55

1

我不認爲你需要爲你的集合創建包裝模型。只需創建一個存儲名稱和性別的模型。然後,像@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"; 
    }); 
} 
+0

我並沒有真正改變個人模特的性別。在你的例子中,安迪永遠是男性。我可能會將選擇框更改爲Andrea,一位女性。我正在尋找的答案是「添加一個屬性,將事件更改引發到一個集合中,您必須將它包裝在模型中。」我可以創建另一個模型,並在視圖上使用2個模型,但包裝收藏最適合我。 – ctrlShiftBryan 2012-01-06 16:06:16

+0

在此示例中,默認模型將爲男性,但只要您想要更改性別,就可以通過發佈model.set({gender:「female」})輕鬆完成此操作。視圖和集合都可以訪問模型。 查看活動中的自我$(「。genderCheckbox」)。在你的例子中,這會將模型上的性別屬性設置爲女性,並且屬性更改會觸發將調用collection.changeGender和view.changeGender的更改事件。那有意義嗎? – stinkycheeseman 2012-01-06 16:29:16

相關問題