/ / Comportamento estranho com modelos / coleções de backbone, Como obtenho o ID de um modelo recém-criado? - ruby-on-rails, backbone.js

Comportamento estranho com modelos / coleções de backbone Como obter o id de um modelo recém-criado? - ruby-on-rails, backbone.js

Estou tendo um comportamento estranho ao criar modelos com backbone.js e rails 3.0.7 (e coffeescript).

Eu crio um modelo com

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

Isso economiza para os trilhos e o objeto de retorno é o que eu espero (quando eu console.log @model ele retorna um modelo de backbone de aparência adequada com id, cid, atributos ... etc).

Quando eu console.log @ model.id, ele retorna indefinido (mesmo que estivesse lá no console.log @model).

Quando eu console.log @collection, ele retorna a coleção esperada, mas quando eu console.log @ collection.models, ele retorna uma matriz vazia.

Quando carrego a @collection via json na página (trilhos):

( json_from_the_page : #{@collection.to_json} )

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

e console.log @ collection.models tudo funciona bem, então deve ter algo a ver com salvar no servidor?

Alguma idéia ou lugar em que devo procurar no código de backbone para depurar ainda mais?

Respostas:

2 para resposta № 1

De acordo com o código-fonte do Backbone, o ID de um objeto é definido apenas se ele receber o ID durante a construção. Trilhos está definindo o ID; portanto, quando você solicita dos trilhos, você obtém um, mas não recebe quando cria um novo objeto.

Isso é por design; O backbone assume que o ID canônico será definido pelo servidor. Portanto, para um modelo "acabado de fazer", o ID não é definido automaticamente (e o método do modelo isNew() retorna true).

Se você deseja que o modelo recém-criado tenha um ID,salve-o imediatamente (e não atue até que o salvamento retorne) para que seu servidor possa fornecer um ID. Se você tiver um ID programático que seja confiável no lado do cliente, substitua initialize() para fornecer um durante a construção, se um não for fornecido no campo de atributos.


0 para resposta № 2

Eu tive o mesmo problema. Eu estava tentando salvar um modelo e adicioná-lo a uma coleção. Embora isso tenha funcionado, não pude manipular o modelo recém-criado até atualizar a página. Isso estava acontecendo porque, embora eu estivesse salvando o modelo, ele ainda não tinha o ID criado pelo back-end dos trilhos.

Para corrigir esse problema, eu precisava salvaro modelo, defina o ID do novo modelo com base na resposta dos trilhos e, em seguida, adicione-o à coleção. Dê uma olhada no código de exemplo abaixo (escrito em coffeescript). Estou declarando uma função de sucesso para o modelo (assim como uma função de erro). Na função success, estou obtendo o ID no @model ["attribute"] ["0"] que possui a resposta dos trilhos armazenados. Sua configuração pode ser um pouco diferente.

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)