【问题标题】:How do I trigger the success callback on a model.save()?如何在 model.save() 上触发成功回调?
【发布时间】:2011-04-22 16:25:12
【问题描述】:
this.model.save({
  success: function(model, response){
    console.log('success');
  },
  error: function(){
    console.log('error');
  }
})

模型已正确发布到处理保存的服务器,但未触发成功回调。我需要从服务器发回一些东西吗?

【问题讨论】:

  • 原来我做错了:正确的语法应该是:this.model.save(newItem, {success : ..., error: ... })
  • 'null' 似乎也可以用作占位符。
  • @UpTheCreek 谢谢。这有帮助。我查看了源并传递了一个空字符串作为键和值。不过更喜欢你的方法。
  • @UpTheCreek null 由于某种原因对我不起作用,但传递一个空的 attr obj 确实:)

标签: backbone.js


【解决方案1】:

save 的第一个参数是要保存在模型上的属性:

this.model.save( {att1 : "value"}, {success :handler1, error: handler2});

【讨论】:

  • 我有点困惑 - (1) 我认为主干在保存期间总是将整个模型发回(无法发送部分模型更新)。那么属性名称值的目的是什么? (2) 如果您只是想在执行一些 .set()s 后保存模型怎么办 - 为什么是属性列表? (3) 在文档中,属性列表参数显示为可选。你能澄清一下吗?谢谢。
  • 你可以用你的属性做一堆“设置”,然后在没有任何属性的情况下保存。模型的所有属性总是发送到服务器。使用属性保存只是设置+保存的快捷方式。
  • 虽然看起来很愚蠢,但这正是它的作用,可惜它的文档记录很差。
  • 在我的测试中,如果您没有为“attributes”参数传递某些内容,则不会触发成功和错误回调。这似乎与文档相矛盾... model.save([attributes], [options]) 表明属性是可选的。当我包含属性或属性为 null 时,会触发我的成功和错误回调。当我不包含任何属性时,不会触发回调。
  • 查看了backbone.js的源代码[backbonejs.org/docs/backbone.html]。似乎 attr 是强制性的.. 如果只提供“选项”,则函数假定它是“属性”并搞砸调用​​span>
【解决方案2】:

由于某些未知的原因,上述方法都不适合我。在我的情况下,只有 api 没有被击中。

但是后来在搜索这个时,我碰到了this link,有人尝试将null而不是{}作为第一个参数。

this.model.save(null, {
    success: function (model, response) {
        console.log("success");
    },
    error: function (model, response) {
        console.log("error");
    }
});

所以,这对我有用。希望这对你也有帮助。

【讨论】:

  • 这是正确答案。如果传入 null,Backbone 会将所有属性发送到服务器进行保存。
  • 奇怪的怪癖,但我选择的方法。
【解决方案3】:

您的服务器必须返回一个 JSON 对象。如果响应不是 JSON 对象,则不会触发回调。

如果您的服务器没有返回 JSON 对象,请使用 dataType:"text" 选项执行保存,如下所示:

this.model.save([],{
 dataType:"text",
 success:function() {},
 error:function() {}
});

使用此选项,它不会等待 JSON 响应,而是等待文本,因此将启动回调。

【讨论】:

  • 天哪,谢谢。这让我发疯了。如果这被记录在某处的 Backbone 文档中,那就太棒了,
  • 这救了我的命。我在 Express 4 中使用 res.json({success:result}),但这仍然给我带来了问题。也许我需要做: res.json({"success":"result"}) 什么的......
  • 非常感谢!这让我很开心。
【解决方案4】:

您可以使用如下划线库,因为主干已经依赖于此。请记住 save 的第一个参数必须具有属性,或者您可以只传递 {} 以防您要保存模型本身。

this.model.save({}, _.bind(function(model, response){
  //Do whatever you want e.g.
  this.collection.add(model)
}, this))

【讨论】:

    【解决方案5】:

    所以我有点困惑 - 我是否还需要传递所有属性才能调用保存事件?如果我的模型很大怎么办……我不想手动设置每个属性

    我正在调用 model.save 并尝试执行以下操作:

    this.model.save(
        {
            success: function (model, response) {
                console.log('model saved');
            }
        });
    

    好吧,如果有人发现这篇文章,我只是回答我自己的问题,我做了以下工作:

    this.model.save({ id: this.model.get('id') },
        {
            success: function (model, response) {
                console.log("success");
            },
            error: function (model, response) {
                console.log("error");
            }
        });
    

    编辑:由于某种原因我无法回复你,但我可以编辑

    但您不必设置 id:this.model.get('id') 您可以只传递一个空白对象,因为空白属性不会扩展属性,什么都不做:

    this.model.save({}, {
        success: function (model, response) {
            console.log("success");
        },
        error: function (model, response) {
            console.log("error");
        }
    });
    

    【讨论】:

      【解决方案6】:

      以下是我用于保存主干模型的代码。

      this.model.save(model,{
         success:function(model){
             console.log("Saved Successfully");
         },
         error:function(model){
             console.log("Error");
         }
      });
      

      干杯

      罗伊·M·J

      【讨论】:

      • 将本地model 传递给this.model 有点让人分心。model 应该是attributes,它们与this.model 中的所有内容一起设置和保存
      • @Funkodebat: Yes.:).. 我实际上认为这类似于普通的 jquery-ajax,但在 Backbone 中,第一个参数是模型。不一定是通过,而是得到对应的。这确实很令人不安..:(
      • 好吧,事实是,不,你在调用 save 时没有通过模型。 save 的第一个参数是您可以在调用 save 之前设置的额外属性。这就像打电话给model.set(model.toJSON()); model.save()。没有理由将模型设置为模型设置的内容。保存时将模型传递给自身是冗余的缩影。
      • @Funkodebat 我拒绝了您对这个 3 年旧答案的更改,因为它们从根本上改变了作者的回答。这不是编辑/审核系统的意图。如果答案不再相关或不合适,请将其否决并写下一个新答案。审核工具用于修正语法、格式、拼写和大小写,而不是用于调整其他用户的答案。
      • 社区会不同意你的看法。这是一个投票率很高的问题,并且得到了很高的票数。这个问题似乎与社区有关。如果您不同意任何意见,请使用否决按钮。它不是您决定哪些问题和答案有权出现在本网站上的地方,当然也不是您修改其他用户的答案以使其含义发生巨大变化的地方。
      【解决方案7】:

      对于那些想要保存模型而不更新属性的人,您可以执行以下操作:

      model.once("sync", function(model, response, options){
          //
      });
      model.once("error", function(model, response, options){
          //
      });
      model.save();
      

      【讨论】:

        【解决方案8】:

        在初始化函数中,将同步方法绑定到您定义的方法(onSaveSuccess)

                    initialize: function (options) {
                            this.model.on('sync', _.bind(this.onSaveSuccess, this));
        },
                    onSaveSuccess: function() {
                        console.log('saved');
                        this.render();
                    },
        

        这样,每当你运行 this.model.save() 时,如果你的同步成功,它将运行 onSaveSuccess 函数作为回调

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-04
          • 2012-05-04
          • 1970-01-01
          • 2013-09-14
          • 2018-12-23
          • 2013-03-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多