我想将帖子渲染到时间轴中。时间轴包含两个我追加帖子的列。我希望能够将帖子附加到较短的列。新帖子需要预先添加到第一列。
我实际上有一个可以解决这个问题的工作代码,但我觉得它没有那么高效。默认情况下,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,不幸的是我无法更新。
答案 0 :(得分:-1)
您可以覆盖show方法,在那里进行提取,然后在提取完成/失败后调用基本show方法,而不是在render事件中进行提取(比您预期的更频繁地调用)
或者更好的是,你有一个&#34;控制器&#34;它负责获取数据然后将其交给视图而不是视图获取任何东西。