在Backbone.sync之后更新Backbone.Model

时间:2015-11-26 08:52:48

标签: javascript backbone.js backbone-model

我尝试使用Backbone.sync发送请求:

...
async createModel(model) {
  await Backbone.sync('create'/*or 'update' or 'delete'*/, model); 
  console.log(model.toJSON());
  model.fetch(); // i don't want to do this
}
...

.sync('...')服务器响应某些数据后,但该数据与model.toJSON()不同,因此我需要额外的.fetch()方法来正确更新我的模型。

为什么会这样?如何在.sync()之后立即更新我的模型,而无需额外.fetch(){wait: true}选项无效。

1 个答案:

答案 0 :(得分:0)

基于评论看起来你已经解决了这个问题。但是,我并不完全相信您会从该解决方案中获得您希望的确切行为。

如果您只想使用同步我认为您可以通过其他几种方式解决您的问题。根据{{​​3}}使用jquery.ajax并返回一个jqXHR对象,而不是来自调用的实际响应数据。更不用说响应数据仍然不会被格式化为Backbone.Model。但是,您可以像使用ajax请求一样使用.done和.fail,并在那里执行model.set()

...
async createModel(model) {
    await Backbone.sync('create'/*or 'update' or 'delete'*/, model)
        .done(function(data) {
            var newModel = new Model(data);
            [MODEL LOCATION].set(newModel);
        })
        .fail(function(data) {
            console.log('Error: ' + data.status);
        }); 
}
...

然而,你可以完成同样的事情的另一种方式是看起来Backbone documentation, Backbone.sync采用第三个参数[选项]并再次基于Backbone.sync function看起来像它需要的选项是成功和错误回调。因此,如果您使用该模式,它将如下所示:

...
async createModel(model) {
    await Backbone.sync(
        'create', //or 'update' or 'delete' 
        model,
        {
            success: function(data) {
                var newModel = new Model(data);
                [MODEL LOCATION].set(newModel);
            },
            error: function(data) {
                console.log('Error: ' + data.status);
            }
        }
    ); 
}
...

在所有情况下,data参数都是从REST调用返回的响应数据。

无论如何,希望这有助于将来。