0

this何らかの理由で、ビューをレンダリングするためにコールバックに正しく渡されません。_.bind および _.bindAll メソッドを試しましたが、コンテキストを渡すためにどの方法を使用しても、常に初期化時とは異なるレンダリングthisになります。

どんな助けでも大歓迎です

  Navigation.Collection = Backbone.Collection.extend({
    model : Navigation.Model,
    comparator : function(item) {
      return item.get("orderId");
    }
  });

  Menu = new Navigation.Collection();

  Navigation.Views.List = Backbone.View.extend({
    el : 'nav',
    tagName : "div",
    className : "navigation",
    collection : Menu,
    initialize : function(e) {
      console.log(this);
      this.template = "navigation/list";
      this.settings = Settings;

      this.collection.on("add", this.render, this);
    },
    render: function() {
      console.log(this);

      var renderedContent = this.template(this.collection.toJSON());
      console.log(renderedContent);

      return this;
    },

バインドの例:

initialize : function(e) {
  this.collection.on("add", _.bind(this.render, this));
}

bindAll の例:

initialize : function(e) {
  _.bindAll(this, "render");
  this.collection.on("add", this.render);
}

コンソール出力

最初の印刷:

child {cid: "view2", options: Object, views: Object, __manager__: Object, _removeViews: function…}

2 番目の印刷:

Object {resolve: function, resolveWith: function, reject: function, rejectWith: function, notify: function…}

編集:「レンダリング」が呼び出される場所を追加します。これは、Navigation.View.List(上記参照) がコードで定義された直後です。

Navigation.registerModule = function(data) {
  _.extend(data, {
    id : Math.random()
  });
  Menu.add(new Navigation.Model(data));
  Navigation.LayoutManager.removeView(true);
  Navigation.cachedRendering = null;
};
Navigation.View = new Navigation.Views.List();

Navigation.LayoutManager = new Backbone.Layout({
  views : {
    nav : Navigation.View
  }
});

Navigation.LayoutManager.$el.appendTo("nav");

Navigation.LayoutManager.render();

return Navigation;

編集: 他の誰かが同じことに出くわした場合、解決策はbeforeRenderandを使用することafterRenderです。依存関係をアップグレードしていて、 backbone.layoutmanagerの古いバージョンにはこれら 2 つのヘルパーがなく、render()代わりに使用されたために、状態manageにアクセスするためのパラメーターが使用されたため、混乱が発生しましたafter

4

2 に答える 2

1

代わりに次のことを試してください。

this.listenTo(this.collection, "add", this.render);

ListenTo は 0.9.x で追加され、バックボーン ドキュメントから引用された「... ビューを削除するときに、すべてのオブザーバーがバインドされていないビューを簡単に作成できる」ため、推奨されます。これは、コンテキストについても詳しく説明している良い答えです

于 2013-07-24T15:46:18.710 に答える