我正在维护一个javascript应用程序,我希望在几乎所有视图上调用jquery函数。它会是这样的:
SomeView = Backbone.Marionette.ItemView.extend
initialize: ->
@on( 'render', @after_render )
after_render: ->
this.$el.fadeOut().fadeIn()
显然,除了在每个视图中使用after_render()之外,有更好的方法吗?有什么更好的方法呢?如果你能给出包含茉莉花测试的答案,我会< 3你;)
答案 0 :(得分:2)
您正在寻找的事件是onDomRefresh。请参阅此处获取文档: https://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.view.md#view-domrefresh--ondomrefresh-event
答案 1 :(得分:1)
创建自己的基本视图类并将afterRender代码放入其中。创建视图时,请继承此类。
var MyApp.ItemView = Backbone.Marionette.ItemView.extend({
afterRender: function() {
// This will be called after rendering every inheriting view.
}
});
var SpecificItemView = MyApp.ItemView.extend({
// this view will automatically inherit the afterRender code.
});
通常,为所有3种视图类型定义自己的基本视图似乎被认为是一种好习惯。它可以让您以后轻松添加全局功能。
答案 2 :(得分:0)
所有Backbone框架都有一个共同的模式,通常它们有一个render方法,后者又调用beforeRender,renderTemplate和afterRender方法。
render:function(){
this.beforeRender();
this.renderTemplate();// method names are just indicative
this.afterRender();
return this;
}
在Base视图中,您可以将这些方法设置为空函数,并在任意位置实现它们。不确定这个答案是否适用于Marionette
答案 3 :(得分:0)
结合thibaut和Robert Levy的答案,正确的解决方案是:
var baseView = Backbone.Marionette.ItemView.extend({
onDomRefresh: function() {
// This will be triggered after the view has been rendered, has been shown in the DOM via a Marionette.Region, and has been re-rendered
// if you want to manipulate the dom element of the view, access it via this.$el or this.$('#some-child-selector')
}
});
var SpecificItemView = baseView.extend({
// this view will automatically inherit the onDomRefresh code.
});