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 № 1De 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)