1

我想覆盖默认的主干模型变量 (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 加载“包装器,扩展”模块并创建一个新的模型实例然后调用 validate. 它说它不知道任何验证功能......

4

3 回答 3

4

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

于 2012-07-16T06:50:13.187 回答
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的更新冲突,我觉得更接近可继承的过程。

于 2012-07-16T14:36:16.483 回答
0

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

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

于 2012-09-20T18:20:20.053 回答