3

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

次のメッセージが表示されます。

キャッチされていない TypeError: オブジェクト [オブジェクト オブジェクト] にメソッド 'toJSON' がありません

これを解決するためにモデルを取得または渡す方法がわかりません。

いろいろな方法を試しているのですが、うまくいきません。

あなたが私を助けてくれることを願っています。

4

3 に答える 3

2

問題は、渡すモデルが単なる配列であることです。したがって、.toJSON メソッドはありません。grant が提案したように、ビューを作成するときに new 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 に答える
2

問題はこの行のせいだと思います。

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

modelバックボーン Model のインスタンスであることが期待されます。しかし、ここではそうではないと思います.家族のモデルを定義するか、キーの名前を変更してみてください

代わりに、このアプローチを試してください

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

ビューでは、これに次のようにアクセスできます

(this.options.familyMembers.toJSON())
于 2013-05-20T18:54:48.710 に答える
1

「家族」プロパティは配列です。次のいずれかを実行できます...

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 に答える