javascript - 如何在 knockout foreach 中附加到现有元素而不是创建新元素

标签 javascript knockout.js ko.observablearray

这是一个有点小众的案例,但我有一个简单的聊天室风格的场景。

因此,将会有一个可观察的聊天条目数组(这可能会限制为 100 个条目,这些条目会被分页以保持良好的性能)。

所以当前的 foreach 看起来像:

<!-- ko foreach: ChatEntries -->
<div class="chat-entry">
    <img class="entry-sender"></span>
    <span class="entry-content" data-bind="html: Content"></span>
</div>
<!-- /ko -->

目前,对于每个条目,它都会添加一个新的聊天条目,这很好,如下所示:

The existing chat system

但是,如果下一个帖子是同一个人发布的,现在需要仅附加到现有的聊天条目,就像这样(原谅可怕的油漆工作)。

The required chat system

我不知道如何在 knockout 中做到这一点...我想我可以做一个 afterRender 并检查它是否与上一个条目海报相同,然后删除所有创建的 dom 并找到上一个条目并使用jquery或其他东西只是附加元素,但这感觉非常hack-ish,因为我手动操作dom。

那么有什么好的方法来解决这个问题吗?

==编辑==

只是为了澄清一些事情,目前,每当有新条目进入时,我总是附加到可观察数组,但是有一个论点是每次新条目进入时都重新创建数组,因为这会简化事情相当多,但不确定这样做与仅附加单个条目相比的可见影响。

目前在截止点之后有一个大约 50 的缓冲区,因此主数组存储大约 100 个,然后将允许另外 50%(最多 150 个条目),然后一旦超过这个值,它将切断最后 50 个条目,并且重新创建数组,因此再次有 100 个条目,然后用户可以返回查看以前的条目。所以这减少了娱乐性,但听起来最终可能会变得更加复杂。所有传入的聊天内容都存储在本地存储中,因此可以快速分页,无需服务器,因此不必担心丢失聊天数据。

最佳答案

您可以将一些 knockout if$index() 函数一起使用。

这不是最优雅的解决方案,但它很简单并且可以完成工作。

<!-- ko foreach: ChatEntries -->
<div class="chat-entry">
    <!-- ko if: $index() === 0 -->  //first item does not have a previous
        <span class="entry-sender">img</span>
        <span class="entry-content" data-bind="html: Content"></span>
    <!-- /ko -->
    <!-- ko if: $parent.ChatEntries()[$index()-1]-->    //check if previous is same user
        <!-- ko if: user !== ($parent.ChatEntries()[$index()-1].user)-->    
        <span class="entry-sender">img</span>
        <span class="entry-content" data-bind="html: Content"></span>
        <!-- /ko -->
        <!-- ko if: user === ($parent.ChatEntries()[$index()-1].user)-->    
        <span class="entry-content" data-bind="html: Content"></span>
        <!-- /ko -->
    <!-- /ko -->
</div>
<!-- /ko -->

看看 fiddle here

这也可以通过计算字段来完成,但它需要一些 JavaScript 代码并且需要您更改模型。此解决方案只需要更改 html

关于javascript - 如何在 knockout foreach 中附加到现有元素而不是创建新元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17933667/

相关文章:

javascript - 卡在搜索js上

javascript - 添加 Iframe 时 Knockout.js 数据绑定(bind)不起作用

javascript - Cocoa WebView 中的 HTML5 canvas 绘图比 Safari 慢

带有字符串的 Javascript 嵌套数组

javascript - Knockout.js 使用 JSON 级联选项

javascript - knockout.js 并修复了元素上的左滚动绑定(bind)

javascript - knockout 不会从可观察数组中删除项目

javascript - observableArray 替换不更新 UI

javascript - 获取字符输入,跨浏览器