Backbone.js 了解主干模型集、验证和更改回调

Backbone.js 了解主干模型集、验证和更改回调,backbone.js,Backbone.js,主干文档说明: 如果验证失败,Model.set将失败-它不会设置值,因此不会触发任何回调。我们可以将{silent:true}传递给Model.set-然后它将设置值,但也不会触发任何回调 所以 为什么主干模型需要有效的状态来简单地设置属性值?如果我们想在用户与UI交互时设置属性,但模型仍然无效,该怎么办?这意味着更改回调不可用,除非我们通过{silent:true}然后手动触发更改 请说您知道更好的处理方法:)我不确定如何回答为什么的问题,但您可以说,有理由认为set运行验证是好的。例如,它

主干文档说明:

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

所以

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


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

我不确定如何回答为什么的问题,但您可以说,有理由认为set运行验证是好的。例如,它使实时进行客户端验证变得非常简单

如果您的问题只能通过验证用户当前正在更改的值来解决,则可以通过将
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;
    }
  }
})

在主干中,无论何时在模型上调用set,它都会跟踪模型的哪些属性已更改以及哪些属性是新添加的。调用validate可以更有效地执行此操作。在set函数中将{silent:true}作为选项传递会导致validate和change不执行,因此如果不触发任何更改事件

如果要在用户与UI交互时设置属性,但模型仍然无效

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

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_模型变更属性(uiChanges)

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


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

谢谢Andrew,但这将解决一个问题并创建另一个问题:跳过未更改值的验证。