backbone.js保存后不更新模型对象的id,为什么不呢?

时间:2012-05-08 18:06:47

标签: backbone.js

我一直在尝试使用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"));

4 个答案:

答案 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的标准行为。