了解Backbone Model集,验证和更改回调

时间:2012-11-26 22:57:27

标签: backbone.js

Backbone文档说:

  

如果验证失败,Model.set将失败 - 它不会设置值,因此不会触发任何回调。我们可以将{silent:true}传递给Model.set - 然后它将设置值但不会触发任何回调。

所以,

为什么Backbone Model需要一个有效的状态才能简单地设置一个属性值?如果我们想在用户与UI交互时设置属性,但模型无效,该怎么办?这意味着更改回调不可用,除非我们通过{silent:true}然后手动触发更改?!

请说你知道更好的处理方法:)

2 个答案:

答案 0 :(得分:3)

我不确定如何回答 为什么 的问题,但你可以说有一些论据说明为什么设置运行验证是好的。例如,它使得实时进行客户端验证变得非常简单。

如果您的问题只能通过验证用户当前正在更改的值来解决,则可以将validate方法与hasChanged方法结合使用。

例如:

Backbone.Model.extend({
  defaults : { name : "" },

  validate : function (attrs) {
    var errors = {};
    if(this.hasChanged("name") && attr.name.length == 0) {
      errors.name = "Need a name yo!";
    }
    //...

    if(_.keys(errors).length > 0) {
      return errors;
    }
  }
})

答案 1 :(得分:3)

在Backbone中,无论何时调用模型上的set,它都会跟踪模型的哪些属性已被更改以及新添加了哪些属性。调用验证可以更有效地执行此操作.Passing {silent:true}作为选项如果不触发任何更改事件,则set function导致验证并更改为不执行。

If you want to set attributes as the user interacts with the UI, but the model is not valid yet

在这种情况下,您可以在普通对象中设置更改,确保对象键与模型的属性相同,然后在模型中设置的某些点。

var uiChanges = {name:'x'}; //just fill it with your changes 
ur_model.set(uiModel); //then set it ,this way it fires change events only once

要检查普通对象和模型之间的差异,可以使用 ur_model.changedAttributes(uiChanges);

changedAttributes -  返回包含已更改的所有属性的对象,如果没有更改的属性,则返回false。

您可以进一步使用它,只保存已更改的属性,而不是再次保存整个模型。