在我使用 Backbone 1.0.0 处理的代码中,我的模型的验证函数仅在我去时被调用:
myThing.set( "title", "My title string", { validate : true } );
有没有办法在我的模型的初始化函数中将默认值设置为 true,这样:
myThing.set( "title", "My title string" );
会导致调用验证函数吗?
在我使用 Backbone 1.0.0 处理的代码中,我的模型的验证函数仅在我去时被调用:
myThing.set( "title", "My title string", { validate : true } );
有没有办法在我的模型的初始化函数中将默认值设置为 true,这样:
myThing.set( "title", "My title string" );
会导致调用验证函数吗?
无法覆盖方法的默认行为,但您仍然可以set
直接覆盖该方法,例如:
var set = Backbone.Model.prototype.set;
Backbone.Model.prototype.set = function(key, val, options) {
return set.call(this, key, val, _.extend({validate: true}, options));
}
请记住,该set
方法必须处理 2 种不同的情况(因为它也允许将对象作为参数传递)。所以这个例子不会一直有效。您可以参考实际的 Backbone 代码来查看它是如何完成的示例。
@Loamhoof 给出的答案非常不完整。这是一个完整的解决方案:
/**
* @file
* A Backbone Model subclass that enforces validation when calling set().
*/
(function (Backbone) {
"use strict";
Backbone.MyBaseModel = Backbone.Model.extend({
/**
* {@inheritdoc}
*/
initialize: function (options) {
this.__initialized = true;
return Backbone.Model.prototype.initialize.call(this, options);
},
/**
* {@inheritdoc}
*/
set: function (key, val, options) {
if (this.__initialized) {
// Deal with both the "key", value and {key:value}-style arguments.
if (typeof key === 'object') {
key.validate = true;
}
else {
if (!options) {
options = {};
}
options.validate = true;
}
}
return Backbone.Model.prototype.set.call(this, key, val, options);
}
});
}(Backbone));
我想这会对你有所帮助!
set: function (key, val, options) {
if (!options) {
options = {};
options.validate = true;
}
return Backbone.Model.prototype.set.call(this, key, val, options);
}