Backbone Marionetter ItemView 渲染事件不使用触发器和 listenTo

Backbone Marionetter ItemView render event does not act with triggers and listenTo

我正在开发 Rails Api 基于 backbone.Marionette 并尝试在 itemview 呈现时执行 jquery 代码。 这是我的代码。

class Step1.Layout extends App.Views.ItemView
        template: "wizard/step1/layout"

        triggers:
            "render": "jquery:datetimepicker:runnable"
            "click .glyphicon-calendar" : "jquery:datetimepicker:runnable" ## For Test

这是控制器部分。

Step1.Controller = 

        display: ->
            view = @getStepView()

            view.on "jquery:datetimepicker:runnable", ->
                $('#due_date').datetimepicker format: 'MM/DD/YYYY'

            App.mainRegion.show view

        getStepView: ->
            new Step1.Layout 

因此,"click .glyphicon-calendar" 表现良好,但 "render" 根本不调用控制器中的事件侦听器。 我想这是因为在真实视图存在之前无法触发事件,但不确定。 请注意我希望知道如何在 itemView 渲染时执行 jquery 代码,所以请告诉我它的解决方案。

如果您使用的是 Marionette 的最新版本,您可能希望使用附加事件而不是渲染。 Render意味着你的html已经生成了,但并不意味着它已经在DOM中了。另一方面,当您的视图位于 DOM 中时,会触发 on attach 事件。 datetimepicker 插件可能需要将视图附加到 DOM.

看看这 2 个链接:

本着@k2ndlab回答的精神,你所要做的就是稍微改变你的controller代码,如下:

Step1.Controller = 
    display: ->
        view = @getStepView()

        view.on "attach", -> // Listen to when this view's parent Region triggers 'attach'
            $('#due_date').datetimepicker format: 'MM/DD/YYYY'

        App.mainRegion.show view

事实是 triggers 用于将与视图的 DOM 交互转换为视图事件,而不是将视图事件转换为其他事件,如 docs 中所述.这就是为什么做

triggers:
    "attach": "jquery:datetimepicker:runnable"

对您不起作用,因为 triggers 没有监听视图事件。在您的情况下,您只想知道视图何时位于 DOM 中并准备好与 jQuery 交互,这就是监听 'attach' 事件的目的。

顺便说一下,建议使用 onAttach 事件,例如 @k2ndlab,即

class Step1.Layout extends App.Views.ItemView
    template: "wizard/step1/layout"

    onAttach: ->
        this.trigger 'jquery:datetimepicker:runnable'

也可以。但同样,这有点做作,因为您真正关心的是 'attach' 事件。