2011-04-22 17 views
104
this.model.save({ 
    success: function(model, response){ 
    console.log('success'); 
    }, 
    error: function(){ 
    console.log('error'); 
    } 
}) 

该模型被正确发布到处理保存的服务器,但成功回调未被触发。我需要从服务器发回一些东西吗?如何在model.save()上触发成功回调?

+7

原来我做错了: 正确的语法应该是:this.model.save(newItem,{success:...,error:...}) – 2011-04-22 18:10:40

+8

'null'似乎也可以用作占位符。 – UpTheCreek 2011-09-21 13:22:36

+0

@UpTheCreek谢谢。这有帮助。我查看了源代码并传递了一个空字符串作为键和值。尽管你的方法更好。 – Pramod 2012-09-20 07:33:38

回答

122

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

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

我有点困惑 - (1)我认为骨干总是在保存期间发回整个模型(这是不可能的发送部分模型更新)。那么属性名称值的目的是什么? (2)如果你只是想在执行一些.set()之后保存模型?为什么属性列表? (3)在文档中,属性列表参数显示为可选。你能澄清吗?谢谢。 – UpTheCreek 2011-09-21 13:19:43

+7

你可以用你的属性做一堆“设置”,然后做一个没有任何属性的保存。模型的所有属性始终发送到服务器。保存属性只是设置+保存的快捷方式。 – Julien 2011-09-23 15:18:11

+0

好的感谢清理我的误解。 – UpTheCreek 2011-09-23 19:08:45

8

所以我是一个有点困惑 - 我还需要在所有属性传递为了让我打电话给一个保存事件?如果我的模型是大..我不希望设置的每种属性手动

IM调用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"); 
    } 
}); 
11

您可以使用下划线LIB作为为骨干已经按照取决于此。请记住,保存的第一个参数必须具有属性,否则您可能只需传递{}以防您希望保存模型本身。

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

this.model(null,[options])仍然可以与Backbone 1.1.0一起使用 – westonplatter 2013-10-24 22:55:49

56

对于一些未知原因,没有上述方法为我工作。 api只在我的情况下没有受到打击。

但后来当这个搜索,我碰到了this link,其中有人曾试图null代替{}作为第一个参数。

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

所以,这为我工作。希望这也能帮助你。

+3

这是正确的答案如果你传入null Backbone会发送所有的属性到服务器保存 – 2013-07-21 22:48:12

+0

奇怪的怪癖,但我选择的方法。 – 2014-10-05 23:17:54

+0

这对我的用例效果最好。谢谢! – 2014-10-20 20:12:08

4

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

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

干杯

罗伊中号Ĵ

+0

它有点分散注意力来传递一个本地'model'到'this.model' ..''模型'应该'属性',这是设置并保存在'this.model'中的所有内容 – Funkodebat 2015-06-08 19:23:56

+0

@Funkodebat:是的。:)我实际上认为这与正常的jquery-ajax类似,但在Backbone中,第一个参数是模型。不一定要通过它,而是得到相应的一个。这真的很令人不安。:( – 2015-06-09 09:05:25

+0

呃,事实是,不,你在调用save的时候并不传递这个模型,save的第一个参数是在调用save之前可以设置的额外属性,它会像调用'model.set(model.toJSON()); model.save()'。没有理由将模型设置为模型设置的模型。在保存模型时,将模型传递给它本身就是多余的缩影。 – Funkodebat 2015-06-09 16:09:51

35

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

如果成功您的服务器不返回JSON对象,执行与的dataType保存:“文本”选项,如:

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

使用该选项将不等待JSON作为回应,但文本,因此回调将启动。

+0

神圣的废话谢谢你。这让我疯狂。如果这被记录在骨干文档的某处,会很棒, – 2015-04-16 04:05:22

+0

这节省了我的屁股。 Express 4使用res.json({success:result}),这仍然给我带来问题。也许我需要做:res.json({“success”:“result”})或其他... – 2015-06-29 19:11:19

1

对于那些想保存模型,没有更新的属性,你可以做到以下几点:

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

在初始化功能,同步方法绑定到你定义的方法(onSaveSuccess)

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

这样,你运行this.model.save(任何时候),它将运行onSaveSuccess功能的回调,如果您的同步是成功

相关问题