骨干.木偶-附加itemview到不同的容器取决于容器的高度

Backbone.Marionette - append itemViews to different container depending on the height of containers

本文关键字:取决于 高度 木偶 附加 itemview 骨干      更新时间:2023-09-26

我想达到的目标

我想把帖子渲染成一个时间轴。时间轴由两列组成,我将帖子附加到这两列。我想要能够附加一个帖子到较短的列。新文章需要添加到第一列。

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

What i tried

这个控制器负责在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。否则,可能会在渲染视图之前缓存并获取posts集合,这会破坏getShortestColumn(见下文)函数。

_wait是jQuery的包装器。等待函数。

这是Timeline类的一部分,它扩展了木偶。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 .

编辑:我忘了说我用的是木偶1.8.6,不幸的是我不能更新。

您可以重写show方法,在那里进行获取,然后在获取完成/失败后调用基本的show方法,而不是在渲染事件中进行获取(无论如何,调用的频率比您预期的要高)。

或者更好,你有一个"控制器"负责获取数据,然后把它交给视图,而不是视图自己获取任何东西。