ChatGPT解决这个技术问题 Extra ChatGPT

如何在 model.save() 上触发成功回调?

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 确实:)

J
Julien

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

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

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

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

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

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

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


这是正确的答案。如果传入 null,Backbone 会将所有属性发送到服务器进行保存。
奇怪的怪癖,但我选择的方法。
I
Igor G.

您的服务器必须返回一个 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"}) 什么的......
非常感谢!这件事情让我感到很快乐。
P
Pradeep Kumar Mishra

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

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

n
nackjicholson

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

我正在调用 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");
    }
});

R
Roy M J

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

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

干杯

罗伊·乔丹


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

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

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

P
Peter Graham

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

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

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


关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅