3

我正在使用主干.js。我得到一个这样的json:

{
    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;
    },
});

我收到这条消息:

未捕获的类型错误:对象 [object Object] 没有方法“toJSON”

我不知道如何获取或传递模型来解决这个问题。

我正在尝试几种方法,但我无法成功。

希望您能够帮助我。

4

3 回答 3

2

我认为问题在于这条线。

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

它期望model成为主干模型的一个实例。但我不认为这里是这种情况..尝试为家庭定义模型或以其他方式更改密钥的名称

而是尝试这种方法

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

在您看来,您可以通过以下方式访问它

(this.options.familyMembers.toJSON())
于 2013-05-20T18:54:48.710 回答
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>
于 2013-05-20T20:38:29.777 回答
1

“family”属性是一个数组,您可以执行以下操作之一...

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

...或将 getFamily 函数添加到 person 模型...

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

...

new DetailsView({model: person.getFamily()});
于 2013-05-20T20:19:53.030 回答