2014-09-13 102 views
0

我有一些代码:验证不起作用?

 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

name仍然存在,因为验证失败使unset无法执行任何操作。

documentation是不是验证与setunset是如何工作的非常明确的,但它是相当明确的与save

验证model.validate(attributes, options)

[...]如果验证返回错误,save将不会继续,并且模型属性将不会在服务器上进行修改。

因此可以合理地认为,验证错误会阻止任何更改当前操作(setunsetsave,...)。

您可以通过检查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源代码。消息来源相当直接,不要害怕跳进去看看发生了什么。

+0

感谢您的回答 – 2014-09-14 05:43:52

0

这样做:要不触发事件,可以使用silent:true选项。我相信你的代码中可能存在一些上游问题。无论如何,请执行以下操作 - 它应该有效。 (在我的测试中,它做到了)。

Person.unset('name',{validate: true,silent:true}) 

p.s .: Mu(below)给出了很好的信息。