2012-05-08 108 views
9

我一直在尝试backbone.js,并且在创建一个新的模型对象时被阻塞,然后调用model.save()。我期望backbone.js的默认行为是用数据库中的id更新模型对象,但事实并非如此。这不应该发生?我已经验证了我正在获取具有json格式属性的帖子。我的服务器将json保存到一个表中,然后将具有新id字段的json返回给backbone.js。它是否正确?我的服务器应该返回整个新对象还是仅返回id或什么?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

响应看起来像从保存呼叫中返回的结果是什么? – kinakuta

回答

6

艰难的从您的文章告诉。两个想法:

1)服务器的响应不成功你的保存调用返回什么?

2)您的“id”属性被命名为ID以外的其他名称。为了考虑不同的名称添加以下模型:

idAttribute : "MyModelsID", 

编辑

你很可能会面临一个时间问题,其中ID之前的警报触发的恢复。而不是你的最后两行的尝试:

row.save(null, 
       { 
       success : function(model, response) { alert(model.get('id'); } 
       } 
     ); 

备选

正如@mu_is_too_short提到的,另一种方式是监听的变化,甚至在模型上,并响应该事件。 (我只是尽量保持答案尽可能接近你的代码)。但是,类似下面伪代码应该让你开始...

var myView = Backbone.View.extend({ 
      .... 
      initialize : function() { 
       this.collection.bind('change', this.SOME_LISTENING_FUNC ); 

      } 
    }); 

,或者,如果你在收集/视图少的世界是这样的创建listenr是......

row.on('change', function() { /* do stuff */ }, this);    
+1

或者将''change''处理程序绑定到模型,并以这种方式获取'save'的结果。 Backbone是一个事件驱动的框架,试图将它串联成一个串行模型并不能很好地工作(这部分主要是针对Cjolly)。 –

+0

@ muistooshort - 所以我们再见面moo。感谢您的选择,我将一些伪代码合并到答案中。 – EBarr

+3

代码有两个问题。首先由服务器返回的json格式还需要引用属性的键(即。{id:“ax”}真的应该是{“id”:“ax”}。 ,保存后我的警报很可能永远不会显示对象的真实性质,因为save是异步的ajax调用,并且在ajax和backbone.js处理完成之前,我们总是会获得警报。 mu是简短**以上建议是正确的方式去: – Cjolly

1

此答案是根据Cjolly在上面的答案中的一条评论。

这是为了使Backbone.Model.save([attributes],[options])成功assiging从服务器新生成的模型ID的模式,即服务器返回模型的id在一个JSON字符串这样{ "id" : <the id> }至关重要。 (注意它是"id"而不是id)。

本质骨干理所当然地需要一个JSON字符串,并在对比如何对象可能在Javascript中定义,而不引用键,JSON需要被引用对象键(见JSON Spec - does the key have to be surrounded with quotes?

因为根据Cjolly的评论这一直是最基本的问题,我想在第二个答案中强调这个解决方案。部分原因是我受到同样的问题的影响,只有通过阅读通过评论我能够得到的见解。

0

我遇到了同样的问题,我发现我保存的模型的validate函数实际上使从后端返回的模型无效。这就是为什么我的领域没有正确更新。

0

也许它有点过时了,但今天我有同样的失踪身份证。 事实证明,服务器只是发送包含新ID的重定向的Header'Location',但不能返回持久化对象。 将对象添加到响应是解决方案。 看来,没有返回对象是与Roo(Spring)生成的Json控制器的标准行为。

相关问题