Backbone.Marionette - 根据容器的高度将itemViews附加到不同的容器

时间:2014-06-26 16:00:35

标签: javascript dom backbone.js coffeescript marionette

我想要实现的目标

我想将帖子渲染到时间轴中。时间轴包含两个我追加帖子的列。我希望能够将帖子附加到较短的列。新帖子需要预先添加到第一列。

我实际上有一个可以解决这个问题的工作代码,但我觉得它没有那么高效。默认情况下,Marionette将新创建的元素附加到documentFragment缓冲区,这应该可以加快渲染速度(减少布局更改等)。此外,我需要在渲染时间轴复合视图后获取帖子(因为两个列都需要附加到DOM以获得高度)。

我尝试了什么

这是负责在app中的某个区域显示视图的控制器:

class APP.Controllers.Companies extends Marionette.Controller

  initialize: ->
    @vent = _.extend {}, Backbone.Events


  show: ->
    posts = APP.request "posts:collection"
    directoriesPromise = APP.request "directories:all"

    postsView = new APP.Views.Posts.Layout
      vent: @vent
      collection: posts

    postsView.on "render", -> posts.fetch()
    @_wait [directoriesPromise], (directories) =>
      APP.execute "show:main", postsView

请注意,我在渲染合成视图后提取帖子,以确保该集合最初为空并且列附加到DOM。否则,在某些情况下会缓存帖子集合并在呈现视图之前获取它,这会破坏getShortestColumn(见下文)函数。

_wait是jQuery.wait函数的包装器。

这是Timeline类的一部分,它扩展了Marionette.CompositeView:

appendHtml: (compositeView, itemView, index) ->
  @getShortestColumn().append itemView.el


getShortestColumn: ->
  minHeight = Number.MAX_VALUE
  shortest = null

  @ui.columns.each ->
    if $(this).outerHeight() < minHeight
      shortest = $(this)
      minHeight = $(this).outerHeight()

  shortest

目标

我希望基本上保留当前的功能,但利用木偶中的缓冲。我还希望能够在显示视图之前获取帖子(就像我对目录一样),以防止超时或减慢连接阻碍用户体验。

我似乎不清楚我在问什么,所以问题是:我如何实现这个目标?

欢迎任何建议或解决方案。 Thanksalot。

编辑:我忘了提到我使用的是Marionette 1.8.6,不幸的是我无法更新。

1 个答案:

答案 0 :(得分:-1)

您可以覆盖show方法,在那里进行提取,然后在提取完成/失败后调用基本show方法,而不是在render事件中进行提取(比您预期的更频繁地调用)

或者更好的是,你有一个&#34;控制器&#34;它负责获取数据然后将其交给视图而不是视图获取任何东西。