2013-05-20 2 views
3

Я использую backbone.js. Я получаю JSON как это:JSON item to Backbone Модель

{ 
    first_name: 'David', 
    last_name: 'Smith', 
    family: [{father: 'David', mother: 'Rose', brother: 'Max'}] 
} 

first_name и last_name показывает в через PersonView (простирающейся Backbone.View) и семьи данных Я хочу, чтобы показать в DetailsView.

Итак, я пробовал вот так. Первый:

personView = new PersonView(model: person)//person it's the json above 

PersonView хорошо показывает. Затем я хочу передать модель в DetailsView так:

detailsView = new DetailsView(model: JSON.parse(person.get('family')); 

Ну, когда я пытаюсь передать модель в качестве шаблона в реализации DetailsView, как это:

DetailsView = Backbone.View.extend({ 
    className: 'tab-pane', 
    template: _.template($('#detail-tpl').html()), 
    render: function(){ 
     this.$el.html(this.template(this.model.toJSON())); 
     return this; 
    }, 
}); 

я получаю это сообщение:

Uncaught TypeError: Object [object Object] has no method 'toJSON'

Я не знаю, как получить или передать модель, чтобы решить эту проблему.

Я пытаюсь несколько способов, но я не могу сделать это.

Надеюсь, вы можете мне помочь.

ответ

2

Я думаю, что проблема есть из-за этой линии.

model: JSON.parse(person.get('family') 

model Он ожидает, чтобы быть экземпляром магистральной модели. Но я не думаю, что это тот случай .. попробовать определение модели для семьи или иным образом изменить название ключа

Вместо попробовать этот подход

familyMembers : JSON.parse(person.get('family') 

на ваш взгляд, вы можете получить доступ к этому, как

(this.options.familyMembers.toJSON()) 
+0

Отлично, это было довольно очевидным решением. Когда ум не понятен ... Thx, он решил мою проблему. – kobayashi

+0

@kobayashi .. Рад помочь ... –

1

свойство "семья" является массивом, вы можете сделать одно из следующих действий ...

var familyArray = model.get('family'); 
new DetailsView({model: new Backbone.Model(familyArray[0])}); 

... или добавить функцию getFamily к модели человека ...

var PersonModel = Backbone.Model.extend({ 
    getFamily: function() { 
     var familyArray = this.get('family'); 
     return new Backbone.Model(familyArray[0]); 
    } 
}); 

... 

new DetailsView({model: person.getFamily()}); 
2

Вопрос заключается в том, что вы модель вы передаете в это просто массив. Поэтому не имеет метода .toJSON. Поскольку грант предложил, вы могли бы использовать новый Backbone.Model при создании представления, но я бы рекомендовал использовать коллекцию и 2 новых представления для семьи. Это будет выглядеть примерно так.

var PersonModel = Backbone.Model.extend({ 
    initialize: function(attributes, options) { 
     if(attributes.family) { 
     this.family = new FamilyCollection(attributes.family, options); 
     } 
    } 
    }); 

    var FamilyCollection = Backbone.Collection.extend({ 
    model: FamilyMember, 
    initialize: function(models, options) { 
     this.view = new FamilyView(options); 
    } 
    }); 

    var FamilyMember = Backbone.Model.extend({ 
    initialize: function(attributes, options) { 
     this.view = new DetailedView({ 
     model: this 


    }); 
    } 
}); 

Тогда вы будете использовать вид структуры что-то вроде этого ..

<div class="person"> 
<span class="name-first">David</span> <span class="name-last">Smith</span> 
<div class="family-members> 
    <div class="family-member"> 
    <span class="name-first">Rose</span> <span class="name-last">Smith</span> 
    </div> 
    <div class="family-member"> 
    <span class="name-first">David</span> <span class="name-last">Smith</span> 
    </div> 
    <div class="family-member"> 
    <span class="name-first">Max</span> <span class="name-last">Smith</span> 
    </div> 
</div> 
</div> 
+0

Thx, было очень полезно ... – kobayashi

Смежные вопросы