Pergunta

Quando busco modelos ou coleções do servidor, não consigo acessar as propriedades do modelo, a menos que eu restrinja e analise novamente.Presumivelmente, os próprios modelos têm alguma sobrecarga extra do backbone.js?Observe que no código abaixo posso executar stringify/analisar sequencialmente, o que deve fornecer o mesmo resultado que comecei.No entanto, claramente eliminei algumas informações supérfluas ao executar essas duas etapas porque as propriedades do meu modelo agora estão expostas de forma diferente de antes.Certamente não preciso passar por essas duas etapas para acessar as propriedades do meu modelo, certo?

Eg.  
thismodel = /// assume this came from server fetch
alert(thismodel.name);    // DOES NOT WORK - undefined

jsonmodel = JSON.stringify(thismodel);
var providerprefslistJSON = jQuery.parseJSON(jsonmodel);
alert(providerprefslistJSON.name);     // WORKS
Foi útil?

Solução

Os objetos do modelo Backbone não são objetos JavaScript simples e antigos.Eles mantêm seus atributos em um hash interno.Para acessar o name atributo você pode fazer isso:

alert(thismodel.attributes.name);

Ou melhor ainda, use o método get():

alert(thismodel.get("name"));

A razão pela qual funciona quando você converte o modelo para JSON e depois vice-versa é porque JSON.stringify chamadas o método toJSON(), que cria uma string JSON de o hash de atributos internos, ou seja, quando você analisa essa string, você obtém um objeto JavaScript simples e antigo - que não é o mesmo que um objeto Backbone Model.

Outras dicas

Primeiro, você está tentando acessar a propriedade do modelo ou resposta?

De alert(thismodel.name) parece que você está optando por uma propriedade do modelo e não pelo atributo.Se você está procurando o atributo model então talvez você queira alert(this.model.get('name'))

Se você realmente está optando por model.name, basicamente o problema pode estar em como você está analisando os dados.Digamos, por exemplo, que o JSON do seu servidor seja assim {'name':'Jimmy'}.

Enquanto o model.response o JSON bruto enviado tem o namespace "Jimmy" em object.name, o Backbone irá automaticamente pegá-lo e transformá-lo em um atributo de modelo, a menos que seja instruído de outra forma (por exemplo,modelObj.attributes.name) em que ponto você usaria o get() função.

Você poderá acessar os dados do modelo de maneira bastante simples se tudo funcionar.

Por exemplo.Buscar

var model = new MyModel();
    model.id = 1;
    model.fetch({
        success: function(model, response) {
            console.log(model.get('name'));  // The model name attribute
            console.log(response.name);  // The RAW response name property
        }
    });

Ou talvez o seu servidor não esteja enviando os dados de volta como dados JSON.A resposta do servidor é content-type="application/json" ?

Algumas coisas para verificar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top