我有一个聊天室风格的应用程序,一旦收到每个条目就会在客户端上处理,然后生成一些 html 来显示它。由于某些消息将包含工具提示和其他嵌入其中的数据位,这些数据使用敲除绑定来显示。
现在,在查看了围绕这个问题的所有帖子之后,这个问题的答案似乎是:
- 确保所有元素都预先存在但为空
- 添加新元素时调用 ko.applyBindings
第一个是不可行的,因为您只在聊天从服务器传入时创建元素,所以第二个选项似乎是唯一的方法,但是这需要调用每条传入的聊天消息。很多人说 ko.applyBindings 可能会产生大量开销,但是我认为这意味着如果您要在所有元素上调用它,而不仅仅是针对特定元素。
为了让每个人都在同一个页面上,这里是重要区域的基本视图片段:
<!-- ko foreach: {data: ChatRoom.Entries, afterRender: ChatEntryRendered } -->
<div class="entry-content" data-bind="html: ProcessedContent"></div>
<!-- /ko -->
忽略周围的位,它基本上会围绕每个条目循环,添加一个包含 html 的 div,该 html 将包含需要应用淘汰赛的绑定。例如,ProcessedContent
可能看起来像:
<span>Some content with a <span data-bind="tooltip: 'Some Content Here'">DYNAMIC</span> bit of <span class="special-text">Content</span></span>
因此,上面的 html 当前不会被 foreach 处理,因为它是动态应用到页面的,并且在每个人都开始为将 html 注入视图而发疯之前,服务器不会发送任何标记,它只是发送一个字符串客户端将其转换为 html 的大量令牌。此外,在没有过多混淆水域的情况下,在这种情况下,ChatRoom.Entries
对象会不时被剔除,因此它会在任何给定时间从 0-200(通常为 100-200)条目波动,其余聊天条目缓存在本地存储中,因此在任何给定时间,视图的绑定条目都不会超过 150 个。
这是一个在实际示例中显示问题的 jsfiddle。