在动态元素上调用ko.applyBindings不起作用

时间:2013-08-10 09:00:08

标签: javascript knockout.js

我有一个聊天室风格的应用程序,每个条目一旦收到就在客户端处理,然后生成一些html来显示它。由于某些消息将包含工具提示和嵌入其中的其他数据位,这些数据使用敲除绑定来显示。

现在,在查看了所有帖子之后,这个问题的答案似乎是:

  • 确保所有元素都预先存在但是为空
  • 添加新元素时调用ko.applyBindings

第一个是不可行的,因为你只是在聊天来自服务器时创建元素,所以第二个选项似乎是唯一的方法,但是这需要调用每个聊天消息。很多人说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。

http://jsfiddle.net/Mps4Q/8/

1 个答案:

答案 0 :(得分:1)

html绑定不绑定插入的html的主要原因是因为它可能不安全。但是,如果您知道它是安全的,您可以使用绑定内容的自定义绑定。以下是另一个SO问题的示例:https://stackoverflow.com/a/17756777/1287183

小提琴:http://jsfiddle.net/Mps4Q/9/