0

Backbone.jsビューのレンダリング関数を動的に拡張しようとしています。そうすることで、renderが呼び出される前後にイベントを発生させることができるようにしたいと思います。関数を上書きして古い関数を呼び出してみましたが、これは機能しますが、render関数にバインドするすべてのモデルはバインドを失います。私が現在持っているコードは次のとおりです。作成したBackbone.jsビューを渡しました。

function bindRenders(view) {

    view.render = (function() {
        var cachedRender = view.render;

        return function() {
            console.log("before render");
            cachedRender.apply(this, arguments);
            console.log("after render");
        };
    }());
}

繰り返しますが、上記のコードは機能しますが、レンダリング関数にバインドされているすべてのモデルは次のようになります。

    this.model.on('change', this.render, this);

壊す。私が見つけた唯一の解決策は、関数を上書きした後、モデルの.on('change')イベントを再バインドすることです。ただし、すべてのビューのモデルがこの方法でバインドされるわけではありません。どんな助けでも大歓迎です!ありがとう!

4

1 に答える 1

1

「休憩」とはどういう意味ですか?モデルが変更されても、以前のレンダリングコードは呼び出されますか?

これは、「change」イベントにバインドされている関数が新しい関数ではなく、変更時に実行されるものではなく、ビューのプロパティ「render」を変更しているだけだからです。私はあなたのバインディングがだったらそれはうまくいくと思います:this.model.on('change', function(){return this.render()}, this)

しかし、なぜあなたがそれを望むのか私にはわかりません。私の意見では、この種の一般的な動作を適用するには、継承を使用する必要があります。

のようなもの(非常に単純化された)

var MyBaseView = Backbone.View.extend({
  ...
  render: function(){
    this.trigger('beforeRender');
    this.beforeRender()

    //do something generic
    ...

    this.afterRender()
    this.trigger('afterRender');
  }
  ...
});

var MyOtherView = MyBaseView.extend({
  ...
  beforeRender: function(){
    //do something specific
  }

  //do NOT override "render"

  afterRender: function(){
    //do some other specific things
  }
  ...
});

または、このようなはるかに優れたソリューションBackbone.jsビューの継承

また、https://github.com/tbranyen/backbone.layoutmanagerには、達成したいことがたくさんあると思います。

于 2012-09-22T13:58:50.873 に答える