view.render()完成后的Backbone.js事件
有人知道在backbone.js中呈现视图后会触发哪个事件吗?据我所知-。源代码中的Render函数为空 渲染的默认实现是无操作 我建议在必要时手动触发它view.render()完成后的Backbone.js事件,backbone.js,Backbone.js,有人知道在backbone.js中呈现视图后会触发哪个事件吗?据我所知-。源代码中的Render函数为空 渲染的默认实现是无操作 我建议在必要时手动触发它 constructor: function(){ Backbone.View.call(this, arguments); var oldRender = this.render this.render = function(){ oldRender.call(this) // this.
constructor: function(){
Backbone.View.call(this, arguments);
var oldRender = this.render
this.render = function(){
oldRender.call(this)
// this.model.trigger('xxxxxxxxx')
}
}
像这样我遇到了这个似乎很有趣的问题
var myView = Backbone.View.extend({
initialize: function(options) {
_.bindAll(this, 'beforeRender', 'render', 'afterRender');
var _this = this;
this.render = _.wrap(this.render, function(render) {
_this.beforeRender();
render();
_this.afterRender();
return _this;
});
},
beforeRender: function() {
console.log('beforeRender');
},
render: function() {
return this;
},
afterRender: function() {
console.log('afterRender');
}
});
或者您可以执行以下操作,这就是主干代码的外观(观察者模式,又名pub/sub)。这是一条路:
var myView = Backbone.View.extend({
initialize: function() {
this.on('render', this.afterRender);
this.render();
},
render: function () {
this.trigger('render');
},
afterRender: function () {
}
});
编辑:
this.on('render','afterRender')代码>将不起作用-因为主干.Events.on
只接受函数。('event','methodName')上的代码>魔术是通过主干.View.delegateEvents实现的,因此仅适用于DOM事件。除了手动添加eventhandler以在初始化时渲染外,还可以将事件添加到视图的“事件”部分。看
e、 g
如果您碰巧正在使用,则木偶会在视图上添加show
和render
事件。有关示例,请参见
另一方面,提线木偶添加了许多您可能感兴趣的其他有用功能。我意识到这个问题已经很老了,但我想要一个解决方案,允许在每次调用渲染
后调用相同的自定义函数,因此提出了以下建议
首先,覆盖默认主干render
函数:
var render = Backbone.View.prototype.render;
Backbone.View.prototype.render = function() {
this.customRender();
afterPageRender();
render();
};
上面的代码在视图上调用customRender
,然后调用通用自定义函数(afterPageRender
),然后调用原始主干render
函数
然后在我的视图中,我将render
函数的所有实例替换为customRender
:
initialize: function() {
this.listenTo(this.model, 'sync', this.render);
this.model.fetch();
},
customRender: function() {
// ... do what you usually do in render()
}
@StefanSchmidt顺便说一句-尝试自己阅读backbone.js源代码。它很可读。是的。。。这就是我在你发帖后发现的。之前我有点害怕。有点像JavaScriptNoob:DYou不需要为此覆盖构造函数。您还可以手动或使用jquery$.Deferred触发它@cept0@Trip固定的。我不认为这有什么关系,但很明显,仅方法的名称不起作用。我现在必须找出原因。@PHPst:编辑的目的是什么,即更改render
以显示“?@PHPst:被触发的自定义事件名为render
,如此.trigger('render')代码>。您从哪里获得show
?你有一些文档的链接吗?据我所知,没有称为show
@PHPst的主干事件。您的编辑完全破坏了我的代码,您可以看到这行this.trigger('render')代码>?嗯,因为我正在render
事件(一个自定义事件,不是主干的一部分)上注册this.afterRender
,this.afterRender
将在模板渲染后激发。我不知道你为什么要编辑它,因为我正在还原它。顺便说一句,“show”这个词甚至没有出现在主干带注释的源代码中……在尝试了大量修复之后,这一个对我来说效果最好。谢谢pilauWhy您需要这行:.bindAll(这是'beforeRender','render','afterRender')代码>?@pilau-请参阅了解u.bind和u.bindAll。它帮助了我,希望它也能帮助你。我知道它的作用,我想问你为什么需要使用它,因为它们(函数)都在扩展视图对象?只是为了帮助澄清:要将自己的函数添加到模型和集合中,你必须使用bindAll。视图不是这样的,它们是自动“绑定”的。@JohnMoses正是我的观点,它们已经是视图对象的一部分。这不起作用。委托事件是指在dom上发生的事件。不是视图对象本身的回调。events
用于DOM事件的声明性回调,请参阅
initialize: function() {
this.listenTo(this.model, 'sync', this.render);
this.model.fetch();
},
customRender: function() {
// ... do what you usually do in render()
}