2012-07-16 78 views
1

我想覆蓋默認的Backbone Model變量(Backbone.Model)以使用我自己的自定義驗證方法(isValid,validate)並添加一些屬性。我如何覆蓋默認的骨幹模型?

_.extend(Backbone.Model, { 
    isValid: function() { // custom function }, 
    validate: function() { // custom logic } 
}); 

var myModel = Backbone.Model.extend({ 
    // this adds for example properties to my modified Backbone model. 
}); 

不幸的是,這並不工作...當我加載「包裝,延長」 - 模與requirejs並創建一個新的Model實例和不是打電話確認。它說它不知道任何驗證函數...

回答

4

因爲所有方法都是構造函數的原型方法,而不是模型上的屬性,所以您必須擴展Backbone.Model.prototype而不是Backbone.Model本身。儘管創建一個自定義的BaseModel可能會更好,它可以擴展Backbone.Model並實現自定義邏輯,以便在骨幹更新等情況下避免可能的衝突,即使在這種情況下它們不太可能仍被認爲是更好的練習擴展基礎骨幹類而不是修改它們。

+0

我也想過這個想法。這將是Backbone.marionette採取的一種類似的方法。不過,我寧願繼續使用Backbone.Model。你能給我一個關於原型擴展的代碼片段嗎? – 2012-07-16 07:18:42

+1

這裏有一些很好的例子,如何擴展核心主幹功能http://ricostacruz.com/backbone-patterns/#mixins – chchrist 2012-07-16 10:33:32

+0

希望你現在到了它,但只是以防萬一'_.extend(Backbone.Model,{ '用'_.extend(Backbone.Model.prototype,{'voila! – 2012-07-17 12:53:29

1

我更喜歡爲項目做自定義模型,而不是「覆蓋」,而不是OOP。 (在結尾的方式可能是相同的,但如果我們試圖模仿OOP,我覺得這更容易理解)。

檢查我的例子,我定義YourAbstractModel它是Backbone.Model的擴展類型,那麼我的所有模型擴展該抽象模型而不是骨幹模型。

var YourProject = {}; 
YourProject.YourAbstractModel = Backbone.Model.extend({ 
    customProperty1 : null, 
    customProperty2 : null, 
    isValid : function(){ },  
    specificUtility : function(){ } 
}); 

var YourModel1 = YourProject.YourAbstractModel.extend({ 
    customProperty1 : 'aaaaa' 
}); 
var YourModel2 = YourProject.YourAbstractModel.extend({ 
    customProperty1 : 'bbbbb' 
}); 

console.log(new YourModel1().customProperty1); 
console.log(new YourModel2().customProperty1); 

我的方式也靈活有多個抽象模型,不會與Backbone的更新衝突,我感覺更接近於可繼承的過程。

0

您可以通過thedersen https://github.com/thedersen/backbone.validation

它非常有益的和易於使用的使用Backbone.Validation插件。您還可以將視圖綁定到模型,以便您的視圖具有未通過驗證的特定模型屬性的自定義錯誤屬性。