如何覆盖默认的Backbone模型?

时间:2012-07-16 06:40:35

标签: javascript backbone.js underscore.js requirejs

我想覆盖默认的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实例而不是调用validate。它说它不知道任何验证函数......

3 个答案:

答案 0 :(得分:4)

你必须扩展Backbone.Model.prototype而不是Backbone.Model本身,因为所有方法都是构造函数的原型方法,而不是模型上的属性。虽然最好创建一个自定义BaseModel来扩展Backbone.Model并实现你的自定义逻辑,这样如果骨干得到更新等,你就会避免可能的冲突,即使在这种情况下它们不太可能仍然被认为是更好的练习扩展基础骨干类而不是修改它们。

答案 1 :(得分:1)

我更喜欢为项目做自定义模型,而不是为非OOP“覆盖”。 (在路的尽头可能是相同的,但如果我们试图模仿OOP,我觉得这更容易理解)。

检查我的示例,我定义YourAbstractModel它是Backbone.Model的扩展类型,然后我的所有模型都扩展了抽象模型而不是Backbone模型。

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的更新不冲突,我觉得更接近可继承的过程。

答案 2 :(得分:0)

您可以使用thedersen的Backbone.Validation插件 https://github.com/thedersen/backbone.validation

它非常有用且易于使用。您还可以将视图绑定到模型,以便视图具有验证失败的特定模型属性的自定义错误属性。