我一直在尝试使用backbone.js,当我创建一个新的模型对象然后调用model.save()时,我一直受到阻碍。我期望使用来自数据库的id来更新模型对象的backbone.js默认行为,但事实并非如此。这不应该发生吗?我已经验证我收到了一个json格式属性的帖子。我的服务器将json保存到表中,然后将带有新id字段的json返回到backbone.js。它是否正确?我的服务器应该返回整个新对象还是只返回id或什么?
//contents of the POST from backbone.js
{ "text":"this is a test" }
//reply from my server
{ id:"15", text:"this is a test" }
我的示例代码位于
之下var SQLRow = Backbone.Model.extend({
table:"",
urlRoot:'db',
url:function () {
return "/" + this.urlRoot + "?table=" + this.table +
"&id=" + this.attributes.id;
}
});
var Xtra = SQLRow.extend ({
table:'Xtra'
});
var row = new Xtra({
text: "this is a test"
});
alert(row.url());
row.save()
alert("row:" + row.get("id"));
答案 0 :(得分:6)
很难从你的帖子中得知。两个想法:
1)来自服务器的响应不成功您的保存呼叫返回什么?
2)您的“id”属性被命名为ID之外的其他属性。要考虑不同的名称,请在模型中添加以下内容:
idAttribute : "MyModelsID",
修改强>
您可能面临计时问题,警报会在ID返回之前触发。而不是你的最后两行试试这个:
row.save( null,
{
success : function(model, response) { alert(model.get('id'); }
}
);
<强> ALTERNATIVE 强>
正如@mu_is_too_short所提到的,另一种方法是在模型上监听更改并响应事件。 (我只是想尽可能地保持答案尽可能接近你的代码)。但是像下面的伪代码这样的东西应该让你开始......
var myView = Backbone.View.extend({
....
initialize : function () {
this.collection.bind('change', this.SOME_LISTENING_FUNC );
}
});
或者,如果你在一个集合/无视图的世界,这样的事情就会产生一个听众......
row.on('change', function() { /* do stuff */ }, this);
答案 1 :(得分:1)
此答案基于上述答案中Cjolly的一条评论。
使Backbone.Model.save([attributes],[options])
成功地使用新生成的模型的id从服务器分配模型是必不可少的,服务器在JSON字符串中返回模型的id
,如{ "id" : <the id> }
}。 (注意它是"id"
而不是id
)。
本质上,骨干正确地期望一个JSON字符串,与Javascript中如何在没有引用键的情况下定义对象形成对比, JSON需要引用对象键(参见JSON Spec - does the key have to be surrounded with quotes?)< / p>
根据Cjolly的评论,这是一个基本问题,我想在第二个答案中强调这个解决方案。部分是因为我遇到了同样的问题,并且只是通过阅读我能够获得洞察力的评论。
答案 2 :(得分:0)
我遇到了同样的问题,而且我发现我保存的模型的validate
函数实际上使从后端返回的模型无效。这就是为什么我的字段没有正确更新的原因。
答案 3 :(得分:0)
也许它有点过时,但今天我有同样的遗失id。 事实证明,服务器只发送带有包含新id的重定向的Header'Location',但不会返回持久对象。 将对象添加到响应是解决方案。 看来,没有返回对象是Roo(Spring)生成的Json-Controllers的标准行为。