1

backbone.js から始めて、backbone-boilerplate を使用して最初のプロジェクトを構築しています。

次のビューを持つNavitemという名前のモジュールがありますSidebar

Navitem.Views.Sidebar = Navitem.Views.Layout.extend({
    template: "navitem/sidebar",
    tagName: 'ul',
    beforeRender: function()
    {
      var me = this;
      this.options.navitems.each(function(navitem)
      {
        //insertView from Layout datatype
        me.$el.append(new Navitem.Views.Item({
          model: navitem //select the 'ul' in sidebar view and append an Item with model navitem
        }).render().el);
      });
      return this;
    }
  });

サイドバーが構築されると、多数の を含むコレクションがサイドバーNavitem.Modelに渡されます。デバッグ後、model:navitem正しく動作しているようで、正しいnavitemモデルをnew Navitem.Views.Item({...}). そのクラスは次のようになります。

Navitem.Views.Item = Navitem.Views.Layout.extend({ 
    tagName: 'li',
    template: 'navitem/default'
    events: {
      click: "navRoute"
    },
    navRoute : function()
    {
      app.router.go(this.model.get('target'));
      return this;
    }
  });

テンプレートは次のようになり<a href="#"><%= model.get('label') %></a>ます。

なんらかの理由Item.render()で、最初のコード ブロックを呼び出すとmodel、ビューで未定義であると泣き言を言います。なぜこれが起こっているのか理解できないようです。何かご意見は?

4

2 に答える 2

0

Backbone Boilerplate と Backbone LayoutManager を使用して作成したプログラムで同様のことを行っています。

Navitem.Views.Item ビューにシリアル化関数を追加してみてください。

// provide data to the template
serialize: function() {
    return this.model.toJSON();
}

次に、Navitem.Views.Sid​​ebar の beforeRender 関数で:

beforeRender: function(){
  _.each(this.options.navitems.models, function(model){
    var view = new Navitem.Views.Item({model: model});
    this.insertView(view);
  }, this);
}

navitem/default テンプレートは次のようになります。

<%= label %>

これは(ビューとコレクションを使用した)テストされていないコードですが、これを行うとうまくいきました。

于 2013-01-23T18:57:37.463 に答える
0

ここで回答された内容に関連している可能性があります: Backbone.js: Template variable in element attribute does not work

モデルをプレーンな JSON としてテンプレートに渡す必要があります (別のバージョンを使用している場合を除きます)。

お役に立てれば!

于 2013-01-13T05:25:14.990 に答える