3

我有一个将数据发送到服务器的简单应用程序:

this.model.save(null, {success: dataSentOK});

然后从服务器@删除数据:

Backbone.sync("delete", data, {success: dataSentOK});

这两种方法都适用于服务器(添加和删除数据)。

但是,在第二种方法中,Backbone.sync(...)不调用成功回调。

谁能告诉我我做错了什么?我查看了 Backbone.js 源代码,我尝试过明确的函数调用:

{success: function(){
    console.log("Done");
}}

以及各种形式的参数:

{success: function(data, textStatus, jqXHR){
    console.log("Done");
}}

我所做的任何事情都不会调用成功函数。

请帮忙。

谢谢亚当

4

2 回答 2

2

执行此操作的更好方法是遵循完善且强大的 JavaScript 事件。Backbone 触发了四个相当重要的事件:syncerror和。destroyinvalid

sync同步操作成功时触发。 error当同步操作失败时触发。 invalid当验证失败时被触发(如果你有那个)。 destroy销毁模型时触发。

因此,我会亲自为您关心的特定模型绑定到此事件,如果是全部,请在模型定义中绑定它。出于我的目的,我绑定到事件的内容会根据上下文发生变化,因此我在视图中按模型绑定它。

例子:

var MyModel = Backbone.Model.extend({
  // your model definition.
});

var MyView = Backbone.View.extend({
  // your view definition
  initialize : function() {
    this.model.on('sync', this.onSync);
    this.model.on('error', this.onError);
    this.model.on('destroy', this.onDestroy);
  },
  this.onSync : function(model, errors, options) {
    // your code
  },
  this.onError : function(model, errors, options) {
    // your code
  },
  this.onDestroy : function(model, errors, options) {
    // your code
  }
});
于 2013-03-23T22:08:05.917 回答
0

Backbone.js 在幕后使用JQuery.ajax(...). 所以我直接使用 JQuery 解决了我的 Backbone.js 通信问题。

Backbone 相信他们通过在自己的代码中包装一个非常好的功能性 API 来增加价值,因为他们选择在模型和用于 CRUD 模型对象的传输协议之间紧密耦合他们的架构。

Model 对象必须具有 URL 属性,这意味着您必须使用模型的send(), fetch() etc功能进行网络通信。实习生,这意味着如果你希望你的模型只是一个 DTO,那么你就不能使用 Backbone.js。这也意味着如果您想直接使用 JQuery,那么您可能根本不使用他们的 MVC 架构。

将 URL 附加到模型对象的含义也意味着应该对所有 CRUD 操作使用相同的 URL。这没有任何意义,尤其是在您使用 REST 服务的情况下。

一个好的架构将是模块化的,并且遵循关注点分离的原则。遗憾的是,Backbone.js 没有这样做,因为它是一个很有前途的框架,只要它不是那么紧密耦合并且难以用于最简单的任务。

于 2013-03-05T15:11:16.603 回答