2011-08-30 71 views
1

当使用backbone.js和rails 3.0.7(以及coffeescript)创建模型时,我遇到了一些奇怪的行为。骨干模型/集合的奇怪行为,如何从新创建的模型中获取id?

我创建

@model = @collection.create 
    param : a_param 
    param : another_param 

模型这样可以节省到轨罚款和返回的对象是什么,我希望(当我CONSOLE.LOG @model它返回一个ID,CID,属性的正确寻找骨干模型...等等)。

当我console.log @ model.id它返回undefined(即使它在console.log @model中)。

当我console.log @collection它返回所需的集合,但是当我console.log @ collection.models它返回一个空的数组。

当我通过JSON加载@collection在(导轨)页:

(json_from_the_page : #{@collection.to_json}) 

@collection = new CollectionName() 
@collection.reset options.json_from_the_page 

和执行console.log @ collection.models一切正常,所以它必须是与保存到服务器?

任何想法或地点,我应该看看骨干代码进一步调试?

+0

此外,我可以访问model.attributes.a_param_i_saved,但不是@ model.attributes.id,它在我登录model.attributes时出现。 – Allansideas

+0

更进一步,如果我在model.save()的成功中设置它,那么它返回的ID很好,所以在服务器有机会返回之前它必须与原始创建运行后的代码有关正确的ID? – Allansideas

+1

确保使用浏览器调试器查看变量的状态(可以使用'debugger;'在代码中设置断点)。我发现console.log经常显示变量的未来状态,并且可能会使调试变得困难。 – idbentley

回答

1

根据Backbone的源代码,只有在构建过程中收到ID时才会设置对象的ID。 Rails正在设置ID,所以当你从轨道上请求它时,你会得到一个,但是当你建立一个新的对象时你不会得到一个。

这是设计;骨干网假定规范ID将由服务器设置。因此,对于“新制造”型号,ID不会自动设置(并且型号的方法isNew()返回true)。

如果您想让新鲜制作的模型具有ID,请立即保存(并且不要在保存返回之前采取行动),以便您的服务器可以提供ID。如果您的客户端具有可靠的编程ID,请覆盖initialize(),以便在构建期间提供一个,如果未在属性字段中提供。

+0

非常感谢!这正是它,我需要做一个概念性的飞跃(在继续之前,你必须等待响应)。 我发现@ collection.bind('add',(m)=> ...)在coffeescript中非常有用,因为我可以访问我需要的范围内的东西(@collection正在闲逛)。干杯:) – Allansideas

0

我遇到了同样的问题。我试图保存模型并将其添加到集合中。虽然这确实起作用,但在刷新页面之前,我无法对新创建的模型进行任何操作。发生这种情况是因为虽然我保存了模型,但它仍然没有由rails后端创建的id。

为了解决这个问题,我需要保存模型,根据rails响应设置新模型的id,然后将它添加到集合中。看看下面的示例代码(用coffeescript编写)。我正在声明模型的成功函数(以及错误函数)。在成功函数中,我得到了@model ['attributes'] ['0']中的ID,它具有存储的rails响应。你的设置可能有点不同。

attrs = 
    name: 'model_name' 

options = 
    success: (data, textStatus, jqXHR) => 
     @model.set 
      id: @model['attributes']['0']['id'] 
     @collection.add(@model) 
    error: (jqXHR, textStatus, errorThrown) => 
     alert 'Failed to create model' 

@model.save(attrs, options)