动态侦听Backbone.js视图的渲染函数

时间:2012-09-21 13:38:38

标签: javascript backbone.js

我正在尝试动态扩展Backbone.js视图的渲染功能。这样做,我希望能够在调用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')事件。但是,并非每个视图的模型都会以这种方式绑定。很感谢任何形式的帮助!谢谢!

1 个答案:

答案 0 :(得分: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 view inheritance

此外,我认为https://github.com/tbranyen/backbone.layoutmanager有很多你想要达到的目标。