我正在尝试动态扩展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')事件。但是,并非每个视图的模型都会以这种方式绑定。很感谢任何形式的帮助!谢谢!
答案 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有很多你想要达到的目标。