Backbone Marionetter ItemView渲染事件不与触发器一起动作并且listenTo

时间:2015-08-18 23:04:20

标签: jquery ruby-on-rails backbone.js render marionette

我正在开发基于backbone.Marionette的Rails Api,并尝试在项目视图呈现时执行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 

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

2 个答案:

答案 0 :(得分:0)

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

看看这两个链接:

答案 1 :(得分:0)

坚持@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'事件。