Eu tenho o seguinte JSON fornecido de um servidor. Com isso, quero criar um modelo com um modelo aninhado. Não tenho certeza de qual é a maneira de conseguir isso.
//json
[{
name : "example",
layout : {
x : 100,
y : 100,
}
}]
Quero que eles sejam convertidos em dois modelos de backbone aninhados com a seguinte estrutura:
// structure
Image
Layout
...
Então, eu defino o modelo de Layout assim:
var Layout = Backbone.Model.extend({});
Mas qual das duas técnicas (se houver) abaixo devo usar para definir o modelo de imagem? A ou B abaixo?
UMA
var Image = Backbone.Model.extend({
initialize: function() {
this.set({ 'layout' : new Layout(this.get('layout')) })
}
});
ou, B
var Image = Backbone.Model.extend({
initialize: function() {
this.layout = new Layout( this.get('layout') );
}
});
define(['modelFile'], function(MyModel){... do something with MyModel})
Mas você está certo. Tenho o hábito de fazer referência ao modelo pela convenção que você sugeriu.Backbone.Model.prototype.parse
função. Então, tudo que seus modelos precisam fazer é definir os tipos de objeto do submodelo (em seu atributo "modelo").Estou postando este código como um exemplo da sugestão de Peter Lyon para redefinir a análise. Eu tive a mesma dúvida e isso funcionou para mim (com um backend Rails). Este código foi escrito em Coffeescript. Eu deixei algumas coisas explícitas para pessoas não familiarizadas com ele.
ou, em JS
fonte
Uso
Backbone.AssociatedModel
de associações de backbone :fonte
Não tenho certeza se o próprio Backbone tem uma maneira recomendada de fazer isso. O objeto Layout tem seu próprio ID e registro no banco de dados back end? Nesse caso, você pode torná-lo seu próprio modelo, como você fez. Caso contrário, você pode apenas deixá-lo como um documento aninhado, apenas certifique-se de convertê-lo de e para JSON corretamente nos métodos
save
eparse
. Se você acabar adotando uma abordagem como esta, acho que seu exemplo A é mais consistente com o backbone, poisset
será atualizado corretamenteattributes
, mas, novamente, não tenho certeza do que o Backbone faz com os modelos aninhados por padrão. É provável que você precise de algum código personalizado para lidar com isso.fonte
new
operadora. Eu editei para corrigir esse erro.Eu escolheria a Opção B se você quiser manter as coisas simples.
Outra boa opção seria usar o Backbone-Relacional . Você apenas definiria algo como:
fonte
Eu uso o plugin Backbone DeepModel para modelos e atributos aninhados.
https://github.com/powmedia/backbone-deep-model
Você pode vincular a eventos de mudança em níveis de profundidade. por exemplo:
model.on('change:example.nestedmodel.attribute', this.myFunction);
fonte
Versão CoffeeScript da bela resposta de rycfung :
Não é fofo? ;)
fonte
Eu tive o mesmo problema e estou testando o código da resposta de rycfung , o que é uma ótima sugestão.
Se, no entanto, você não quiser
set
os modelos aninhados diretamente, ou não quiser passar constantemente{parse: true}
nooptions
, outra abordagem seria redefinir aset
si mesmo.Em Backbone 1.0.0 ,
set
é chamadoconstructor
,unset
,clear
,fetch
esave
.Considere o seguinte super modelo , para todos os modelos que precisam aninhar modelos e / ou coleções.
Observe isso
model
,_setModel
e_unsetModel
são deixados em branco propositalmente. Nesse nível de abstração, você provavelmente não pode definir nenhuma ação razoável para os callbacks. No entanto, você pode querer substituí-los nos submodelos dessa extensãoCompoundModel
.Esses retornos de chamada são úteis, por exemplo, para vincular ouvintes e propagar
change
eventos.Exemplo:
Com isso, você tem criação automática de modelo aninhado e propagação de eventos. O uso de amostra também é fornecido e testado:
Resultado:
fonte
Sei que estou atrasado para esta festa, mas recentemente lançamos um plugin para lidar exatamente com esse cenário. É chamado de backbone-nestify .
Portanto, seu modelo aninhado permanece inalterado:
var Layout = Backbone.Model.extend({...});
Em seguida, use o plug-in ao definir o modelo contido (usando Underscore.extend ):
Depois disso, supondo que você tenha um modelo
m
que seja uma instância deImage
e tenha definido o JSON a partir da perguntam
, você pode fazer:fonte
Use formulários de backbone
Ele suporta formulários aninhados, modelos e toJSON. TODOS ANINHADOS
fonte
Se você não quiser adicionar outra estrutura, pode considerar a criação de uma classe base com
set
e substituídatoJSON
e usá-la assim:Você precisará
BaseModel
desta resposta (disponível, se desejar, como uma essência ).fonte
Também temos esse problema e um trabalhador da equipe implementou um plugin chamado backbone-nested-atributos.
O uso é muito simples. Exemplo:
Com isso, o modelo Árvore pode acessar os frutos:
Você pode ver mais informações aqui:
https://github.com/dtmtec/backbone-nested-attributes
fonte