2012-07-24 164 views
3

我正在使用create方法向集合添加模型,并且API响应得很好。该模型似乎已被正确返回,并看到我正在寻找的console.dir(resp);。但是,当我尝试访问runningorderid(即idAttribute定义的id)时,响应为空。我认为这与响应的异步本质有关,但我不知道如何处理它。Backbone.js - 从集合中获取ID创建

var resp = window.app.RunningOrderCollection.create(
     { runningorderid: null, listitemid: 1, starttime: n} , 
     { wait: true } 
); 
console.dir(resp); 
console.dir(resp.get("strt")); 
console.dir(resp.id); 

screenscape of problem

+3

你已经有你的问题的答案。但是为了暴露一个解释,为什么'console.log'显示'id'时,它仍然不存在:http://stackoverflow.com/a/9912865/316700 – fguillen 2012-07-24 10:01:36

回答

2

collection.create,由于涉及到服务器请求的所有方法,的确是异步的。在你的情况下,你可以听同步事件来获得所需的结果。

http://backbonejs.org/#Collection-create

创建模型会造成的直接“添加”事件的收集,以及“同步”事件触发 ,一旦模式已经 成功的创建服务器。

例如:

resp.on('sync', function(model) { 
    console.dir(resp); 
    console.dir(resp.get("strt")); 
    console.dir(resp.id); 
}); 
+0

很好,现在对此有了更好的理解。 – Joe 2012-07-24 10:29:05

+1

工作很好 - 谢谢!单页应用程序... – Rich 2013-06-13 16:47:11

2

为了规避收藏和型号的服务器的操作的异步性质,绑定操作后,将要采取的,当这些操作被触发事件的行动完了。例如,Backbone.js的文档有the following to say关于收藏的create - 功能:

创建模型会造成的直接“添加”事件进行的收集,以及“同步”事件触发,一旦模型已经在服务器上成功创建。如果您希望在将新模型添加到集合之前等待服务器,请传递{wait:true}。

因此,您已通过{wait:true},因此当模型在服务器上创建并添加到集合时,集合将触发add事件。有了这个逻辑:

window.app.RunningOrderCollection.on('add', function(resp) { 
    console.dir(resp); 
    console.dir(resp.get("strt")); 
    console.dir(resp.id); 
}); 
var model = window.app.RunningOrderCollection.create(
    { runningorderid: null, listitemid: 1, starttime: n} , 
    { wait: true } 
); 

退房获取更多信息Backbone.js的文档中的方位catalog of events

希望这会有所帮助!

+0

谢谢,这工作。 – Joe 2012-07-24 10:28:52