在与服务器同步之前是否存在等效的解析?

use*_*171 3 backbone.js

在我的骨干模型中,我解析了服务器的响应:

var MyModel = Backbone.Model.extend({
    urlRoot: "/users",
    parse: function(response){
        var data = {};
        data.id = reponse.userDetails.id;
        data.name = response.userDetails.firstname + " " + response.userDetails.lastname;
        data.description = response.userDetails.description;

        return data;
    }
});

var myModel = new MyModel({id: 1});
myModel.fetch();
Run Code Online (Sandbox Code Playgroud)

使用此模型的视图可以操纵它,例如,如果用户单击视图以"选择"它,它将更新模型...

myModel.set({selected: true});
Run Code Online (Sandbox Code Playgroud)

...并且视图将根据模型的更改事件重新渲染,并突出显示"已选择"的用户.

在将模型保存到服务器时,如何仅发送服务器所需的属性?并忽略通过用户交互添加的属性.

要么

数据模型是否应始终反映服务器返回的内容?如果是这样,是否有更好的方式来存储用户交互(视图是否"选中")?它应该是一个单独的模型而不是实际的数据模型吗?

谢谢

Jef*_*ith 5

如果对您的应用程序没有意义,则模型不需要镜像服务器上的数据.

对于模型的属性,如果您不需要在模板中呈现这些属性,则只需覆盖model.toJSON()以仅序列化要发送到服务器的属性.但请注意,在这种情况下,如果您使用this.model.toJSON()它渲染模板(或其他任何东西),那么它也会受到影响.如果这是一个问题,那么您可以覆盖model.sync()并操纵传入之前传入的数据Backbone.sync.例如:

var myModel = Backbone.Model.extend({
  sync: function (method, model, options) {
    // remove the unwanted attributes. Something like...
    options.attrs = _.pick(model.attributes, 'attribute1', 'attribute2', 'attribute3');
    return Backbone.sync.call(this, method, model, options);
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 或者更好的是,保留`toJSON`以进行服务器通信(因为标准JSON库期望该方法)并添加另一种方法来为视图准备事物.然后`toJSON`可以镜像`parse`,你可以使用另一个方法为你的视图执行通常的`_(this.attributes).clone()`(无论如何都是标准的`toJSON`). (3认同)