对onRender中的元素执行操作不起作用

时间:2012-05-13 15:24:03

标签: marionette

当我尝试对onRender方法(或item:rendered回调)中的某些HTML元素进行操作时,它会失败。

示例:

Bars.EditGallery = Backbone.Marionette.ItemView.extend
  template: 'bars/edit_gallery'
  className: 'edit-gallery'

  onRender: ->
    # If I just write @$('select').chosen(), it doesn't work
    # despite the jQuery object contains what I expect.
    # To get it working, I have to write:
    callback = -> @$('select').chosen()
    setTimeout(callback, 0)

与其他行为相同,例如将重点放在某个领域 你怎么处理那件事呢? setTimeout的诀窍有效,但不是很优雅。

2 个答案:

答案 0 :(得分:1)

我已经看到当用于渲染的模板异步加载时会发生这种情况。在最近的一个版本中,我认为我的拉请求已经解决了这个问题。您使用的是什么版本的木偶?

但是看起来你正在使用JST,所以这应该不是问题。您的设置中还有其他任何因素导致渲染异步发生吗?

但是,似乎有一些异步问题正在发生。由于使用setTimeout修复了问题,因此我认为在调用onRender方法之前渲染未完成。

此外 - 可以很难判断jQuery选择器是否实际上正在返回您想要的对象。如果您使用console.log来检查选择器,则可能会产生错误结果。 console.log本身是异步的(在大多数浏览器中,无论如何......不确定所有)这意味着记录项目的请求在事件循环结束时排队。在记录发生时,DOM元素可能是可用的。

FWIW:我定期使用onRender用于此目的,而且我从未使用setTimeout来使其正常工作。所以我的假设是渲染过程中有趣的事情,与异步的东西有关。

答案 1 :(得分:0)

此问题是由Chosen引起的this issue引起的。