【问题标题】:Understanding Backbone Model set, validate and change callbacks了解 Backbone 模型设置、验证和更改回调
【发布时间】:2012-11-26 22:57:26
【问题描述】:

Backbone 文档说:

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

所以,

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

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

【问题讨论】:

    标签: backbone.js


    【解决方案1】:

    我不知道如何回答 为什么 问题,但您可以说,为什么 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;
        }
      }
    })
    

    【讨论】:

    • 感谢 Andrew,但这会解决一个问题并创建另一个问题:跳过未更改值的验证。
    【解决方案2】:

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

    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。

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

    【讨论】:

      猜你喜欢
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多