我有一些代码:
var Person = new Backbone.Model({name: 'Jeremy'});
Person.validate = function(attrs) {
if (!attrs.name) {
return 'I need your name';
}
};
Person.on("invalid", function(model, error) {
alert(model.get("title") + " " + error);
});
Person.set({name: 'Samuel'});
console.log(Person.get('name'));
// 'Samuel'
Person.unset('name', {validate: true});
console.log(Person.get('name'));//Why can i print name here if it unsetted?
当我输入未设置的方法时,我会看到错误提示。这是对的。但是,为什么我可以在控制台中打印出未设置的名称?
答案 0 :(得分:0)
name
仍然存在,因为验证失败阻止unset
做任何事情。
documentation对于验证如何与set
和unset
一起使用并不十分明确,但save
非常明确:
验证
model.validate(attributes, options)
[...]如果验证返回错误,
save
将无法继续,并且不会在服务器上修改模型属性。
因此,认为验证错误会阻止当前操作(set
,unset
,save
,...)更改任何内容是合理的。
通过检查Backbone源代码,您可以了解它是如何工作的。首先,您需要知道unset
只是伪装成set
来电:
unset: function(attr, options) {
return this.set(attr, void 0, _.extend({}, options, {unset: true}));
}
所以我们看一下set
:
set: function(key, val, options) {
// A bunch of boring bookkeeping stuff...
// Run validation.
if (!this._validate(attrs, options)) return false;
// The stuff that changes attributes and triggers events.
}
只要set
知道它正在使用什么,就会发生验证,如果验证失败,set
会返回而不会更改任何内容。
Backbone文档留下了很多重要的东西,所以如果你打算使用Backbone,你需要熟悉Backbone来源。来源相当直接,不要害怕跳进去看看发生了什么。
答案 1 :(得分:0)
执行此操作:要不触发事件,可以使用silent:true选项。我相信您的代码上游可能存在一些问题。无论如何,做以下 - 它应该工作。 (在我的测试中,确实如此)。
Person.unset('name',{validate: true,silent:true})
p.s。:Mu(下面)给出了很好的信息。