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


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

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


7
原来我做错了:正确的语法应该是:this.model.save(newItem,{success:...,error:...})
运行Turtle

8
'null'似乎也可以作为占位符正常工作。
UpTheCreek 2011年

@UpTheCreek谢谢。有帮助。我查看了源,并传递了一个空字符串作为键和值。更喜欢您的方法。
普拉莫(Pramod)2012年

@UpTheCreek null出于某种原因对我不起作用,但通过了一个空的attr obj却
起作用

Answers:


123

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

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

9
我有点困惑-(1)我以为骨干总是在保存期间将整个模型发回(无法发送部分模型更新)。那么,属性名称-值的目的是什么?(2)如果只想在执行一些.set()s之后保存模型,该怎么办-为什么要使用属性列表?(3)在文档中,属性列表参数显示为可选。你能澄清一下吗?谢谢。
UpTheCreek 2011年

7
您可以对属性进行一堆“设置”,然后执行不包含任何属性的保存。模型的所有属性总是发送到服务器。使用属性保存只是set + save的快捷方式。
Julien

5
看起来这确实很愚蠢,可惜它没有被很好地记录。
凯文

51
在我的测试中,如果您没有为“属性”参数传递某些内容,则不会触发成功和错误回调。这似乎与文档相矛盾。model.save([attributes],[options])表示属性是可选的。当我包含属性或属性为null时,将触发成功和错误回调。当我不包含任何属性时,不会触发回调。
凯文

6
检查了ribs.js的源代码[ bonesjs.org/docs/backbone.html ]。似乎attr是强制性的。.如果仅提供“ option”,函数将假定它为“ attr”并弄乱了呼叫
Kumaresan 2012年

58

由于某种未知的原因,以上方法均不适用于我。在我的情况下,仅未找到该api。

但是稍后在搜索此内容时,我碰到了该链接,其中有人尝试null将其{}作为第一个参数而不是。

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

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


3
这是正确的答案。如果传入null,则Backbone会将所有属性发送到服务器进行保存。
Paul Oliver

奇怪的怪癖,但我选择的方法。
马特·弗莱彻

37

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

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

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

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


废话谢谢。这让我疯狂。如果在某些地方的Backbone文档中有记录,那就太好了
Tobias J

这救了我的屁股。我在Express 4中使用了res.json({success:result}),但这仍然给我带来了问题。也许我需要做:res.json({“ success”:“ result”})或其他东西
Alexander Mills

非常感谢!这件事情让我感到很快乐。
alcfeoh

11

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

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

8

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

即时通讯调用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");
    }
});

4

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

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

干杯

罗伊·梅杰(Roy MJ)


将本地model传递给this.model.. model应该有点分心,应该将attributes其与所有内容一起设置和保存this.model
Funkodebat 2015年

@Funkodebat:是的。:)我实际上以为这与普通的jquery-ajax类似,但是在Backbone中,第一个参数是模型。不一定要通过它,而是要获取相应的。这是很令人心碎.. :(
罗伊MJ

好吧,事实是,不,您在调用save时不会通过模型。save的第一个参数是可以在调用save之前设置的额外属性。就像打电话一样model.set(model.toJSON()); model.save()。没有理由将模型设置为模型的设置。.保存时将模型传递给自身是多余的缩影。
Funkodebat 2015年

2
@Funkodebat我已经拒绝了您对此3岁答案的更改,因为它们从根本上改变了作者的回复。这不是编辑/审核系统的目的。如果答案不再相关或不合适,请将其否决并写下一个新答案。审核工具用于修正语法,格式,拼写和大小写,而不用于调整其他用户的答案。
6

2
社区会不同意您的意见。这是一个投票最多的问题,票数最高的答案是很高的。这个问题似乎与社区有关。如果您不同意,请使用“投票”按钮。在这里您不是要决定哪些问题和答案有权在此站点上的位置,当然也不是在将其他用户的答案修改为意义严重的地方。
6

1

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

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

1

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

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

这样,无论何时运行this.model.save(),如果同步成功,它将运行onSaveSuccess函数作为回调。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.