【发布时间】:2013-06-29 20:31:29
【问题描述】:
在我使用 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 方法必须处理两种不同的情况(因为它也允许将对象作为参数传递)。所以这个例子不会一直有效。您可以参考实际的 Backbone 代码来查看它是如何完成的示例。
【讨论】:
set 显然不是一个随机函数。
@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() 调用不会得到验证。如果你也想验证它,那么你可以去掉initialize() 方法和this.__initialized 检查。
key.validate = true; 应该是val.validate = true。此外,options.validate = true; 将阻止用户覆盖您现在的默认行为(他不能跳过验证)。我一定遗漏了一些东西,但是您的 __initialized 属性的目的是什么?作为旁注,以这种方式覆盖 initialize 方法将删除额外的参数(你永远不知道),为什么不改用 Backbone.Model.prototype.initialize.apply(this, arguments); 呢?
val.validate = true,但这显然是错误的。我想知道你为什么会犯同样的错误:) 确实,用户不能再跳过验证了。这是我的应用程序中故意的。 __initialized 变量的目的是在构建/初始化模型时跳过验证。 initialize() 的其他参数不是 Backbone API 的一部分,因此不受支持。
key.validate。如果您将对象作为第一个参数传递,则选项包含在第二个参数中,即val。在key 对象中将validate 设置为true 只会向模型添加不需要的属性,并且无法确保验证。我一定是错过了什么。
我想这会对你有所帮助!
set: function (key, val, options) {
if (!options) {
options = {};
options.validate = true;
}
return Backbone.Model.prototype.set.call(this, key, val, options);
}
【讨论】: