【问题标题】:Internal Backbone model method and update it from server内部主干模型方法并从服务器更新
【发布时间】:2018-06-18 19:57:24
【问题描述】:

我有一个名为“Project”的简单 Backbone 模型。

我想添加一个方法 .open

这个方法会调用一个 REST api,它会改变一些属性(我会收到新的 json)。

有没有办法从响应中更新当前模型?这种方法正确吗?

var project = Backbone.Model.extend({ ...

open: function() {
... // request to the server  and update the current object... //
}

...
}

【问题讨论】:

    标签: javascript model-view-controller backbone.js


    【解决方案1】:

    Backbone.Model 已经有一个fetch function。这可以使 REST 调用“获取”数据,并在成功时自动更新模型的属性。 fetch 函数需要url,可以为每次调用传入,也可以在模型上定义。请参见下面的示例。

    此外,使用fetch 还会有额外的好处。示例:from fetch docs

    如果服务器的状态与当前属性不同,则触发“更改”事件。

    这意味着您可以根据需要向此模型的事件添加侦听器。一种常见的模式是重新渲染模型“更新”的视图。

    此外,fetch 将自动通过 model's parse function 运行响应,如果您希望模型上的数据结构与 REST 调用中的数据结构不同,这将非常有用。

    例子:

    var Project = Backbone.Model.extend({
      url: 'my-url/to-rest-call', // defined on model
      parse: function(resp) {
        // by default, returns resp only
        // Doing this sets model attributes to resp.data object
        return resp.data;
      }
    });
    var project = new Project();
    // runs myView's render function if updated
    myView.listenTo(project, 'update', myView.render);
    
    // now fetch using url defined on model
    project.fetch();
    // OR passed with call
    project.fetch({
      url: 'my-other-url/to-rest-call'
    });
    

    【讨论】:

    • fetch 发送 GET 请求,不会改变模型属性,也不应该用来改变模型属性
    • 这是真的,我首先将这个问题看作是对客户端模型的简单获取和更新。您当然可以使用save 发送POST 请求来更新服务器。
    【解决方案2】:

    这个方法会调用一个 REST api,它会改变一些属性(我会收到新的 json)。

    如果你想更新模型属性,你应该使用model.save()

    有没有办法从响应中更新当前模型?

    model.save() 将使用返回的响应自动更新模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多