0

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

SomeView = Backbone.Marionette.ItemView.extend

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

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

显然有比在每个视图中都有一个 after_render() 更好的方法吗?更好的方法是什么?如果你能给出一个包含茉莉花测试的答案,我会 <3 你;)

4

4 回答 4

2

您要查找的事件是 onDomRefresh。有关文档,请参见此处: https ://github.com/marionettejs/backbone.marionette/blob/master/docs/marionette.view.md#view-domrefresh--ondomrefresh-event

于 2013-10-07T21:13:50.153 回答
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 种视图类型定义自己的基本视图似乎被认为是一种好习惯。它将使您能够在以后轻松添加全局功能。

于 2013-10-07T21:23:56.783 回答
0

所有 Backbone 框架都有一个通用模式,通常它们有一个渲染方法,该方法依次调用 beforeRender、renderTemplate 和 afterRender 方法。

render:function(){
   this.beforeRender();
   this.renderTemplate();// method names are just indicative
   this.afterRender();
   return this;
}

在您的 Base 视图中,您可以将这些方法设置为空函数,并在您想要的任何地方实现它们。不确定这个答案是否适用于 Marionette

于 2013-10-07T19:17:56.327 回答
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.
});
于 2013-10-08T10:05:16.803 回答