我有一个聊天室风格的应用程序,每个条目一旦收到就在客户端处理,然后生成一些html来显示它。由于某些消息将包含工具提示和嵌入其中的其他数据位,这些数据使用敲除绑定来显示。
现在,在查看了所有帖子之后,这个问题的答案似乎是:
第一个是不可行的,因为你只是在聊天来自服务器时创建元素,所以第二个选项似乎是唯一的方法,但是这需要调用每个聊天消息。很多人说ko.applyBindings可能会产生很大的开销,但是我认为它们意味着你要把它称为所有元素,而不仅仅是针对特定元素。
为了让所有人都在同一页面上,以下是重要区域的基本视图片段:
<!-- ko foreach: {data: ChatRoom.Entries, afterRender: ChatEntryRendered } -->
<div class="entry-content" data-bind="html: ProcessedContent"></div>
<!-- /ko -->
忽略它周围的位,它基本上会循环每个条目,添加一个包含html的div,它将包含需要应用的敲除优点的绑定。例如,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。
答案 0 :(得分:1)
html
绑定不绑定插入的html的主要原因是因为它可能不安全。但是,如果您知道它是安全的,您可以使用绑定内容的自定义绑定。以下是另一个SO问题的示例:https://stackoverflow.com/a/17756777/1287183