在Backbone中,如何在所有视图上都有after_render()?

时间:2013-10-07 19:03:07

标签: javascript backbone.js coffeescript marionette

我正在维护一个javascript应用程序,我希望在几乎所有视图上调用jquery函数。它会是这样的:

SomeView = Backbone.Marionette.ItemView.extend

  initialize: ->
    @on( 'render', @after_render )

  after_render: ->
    this.$el.fadeOut().fadeIn()

显然,除了在每个视图中使用after_render()之外,有更好的方法吗?有什么更好的方法呢?如果你能给出包含茉莉花测试的答案,我会< 3你;)

4 个答案:

答案 0 :(得分:2)

答案 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.
});