javascript - knockout JS : Unable to process binding "if: function (){return conversations }"

标签 javascript web knockout.js

先说说我的看法

<div data-knockout="messenger-block">
<div id="messenger-attachment-container" class="container-messenger">
    <div style="display:none" data-bind="visible: conversations().length > 0">
    </div>
</div>
<div id="messenger-dialog-container" class="container-messenger-bottom">
    <div data-bind="visible: conversations().length > 0, if: conversations">
    <!-- ko foreach: conversations -->
        <div class="display-discussion-block object-shadow-near">
            <div class="display-discussion-header"> <!-- Quand un nouveau message appliquer la classe .display-discussion-header-active -->
                <div data-bind="if: receiver">
                    <div class="display-avatar object-shadow-near"
                         data-bind="style: { backgroundImage: 'url(' + receiver().profilePicture.url + ')' }">
                    </div>
                </div>

                <div class="status connected"></div>
                <a href="#">
                    <div data-bind="if: receiver">
                        <span data-bind="text: receiver().firstname"></span> <span data-bind="text: receiver().lastname"></span>
                    </div>
                </a>

                <button class="btn-options messenger-popover-action"></button>
                <div class="popover-standard messenger-options" style="display:none; margin-left : -80px; margin-top : 21px;">
                    <ul>
                        <li class="attach-detach">Attacher</li>
                        <li>Afficher la conversation complète</li>
                    </ul>
                </div>
            </div>
            <div class="container-discussion-body">
                <div class="container-discussion">
                    <div data-bind="if: conversation() && conversation().messages">
                    <!-- ko foreach: conversation().messages -->
                        <!-- ko if: ($index == 0 || sender.id != $parent.messages[$index].sender.id) -->
                            <!-- ko if: $index > 0 -->
                                    </div><!-- block-discussion -->
                                </div><!-- container-msg -->
                            <!--/ko-->
                            <div class="block-discussion">
                                <div class="container-msg">
                        <!--/ko-->
                        <div data-bind="css: $parents[1].blockMessageClass(sender.id)">
                            <span data-bind="text: content"></span>
                        </div>
                        <!-- ko if: $parents[1].appUser().id == sender.id -->
                            <div style="clear:both"></div>
                        <!--/ko-->
                    <!--/ko-->
                            </div>
                        </div>
                    </div>
                </div>
            </div>
            <div class="container-submit">
                <form>
                    <div class="form-group">
                        <textarea class="form-control" data-toggle="submit-enter" placeHolder="Répondre quelque chose.." rows="1"></textarea>
                        <div class="block-icons">
                            <div class="icons icon-add-img"></div>
                            <div class="icons icon-add-smiley"></div>
                        </div>
                    </div>
                </form>
            </div>
        </div>
    <!--/ko-->
    </div>
</div>

一切正常,但是当我添加这些行时:

<!-- ko if: $index > 0 -->
        </div><!-- block-discussion -->
    </div><!-- container-msg -->
<!--/ko-->

我的浏览器出现以下错误:“错误:无法处理绑定(bind)“if: function (){return conversations }” 消息:找不到匹配的结束评论标签:ko foreach: conversations ".

我不知道为什么这些行会造成问题。如果我放一些,它就会坏掉。

这是我的 JS:

var ConversationModel = {
    conversations: ko.observableArray().publishOn("conversationModel"),
    open: function(userId){
        for(var i = 0; i < this.conversations().length; i++){
            if(this.conversations()[i]().userId == userId){
                return;
            }
        }

        var self = this;
        var obj = ko.observable({
            userId: userId,
            receiver: ko.observable(),
            conversation: ko.observable()
        });

        self.conversations.push(obj);

        UserManager.getUserData(userId, function(user){
            obj().receiver(user);
            ko.postbox.publish("conversationModel", self.conversations());

            $.getJSON(EvoRoutes.messenger.getConversation, "receiver=" + userId, function(data){
                obj().conversation(data);
                ko.postbox.publish("conversationModel", self.conversations());
            });
        });
    }
};
function ConversationDialogViewModel(){
    var self = this;

    this.conversations = ko.observableArray().subscribeTo("conversationModel");
    this.appUser = ko.observable().subscribeTo('appUserTopic');

    this.blockConversationClass = function(id){
        return (id == self.appUser().id) ? 'user-discussion-block' : 'other-discussion-block';
    };

    this.blockMessageClass = function(id){
        return (id == self.appUser().id) ? 'user-display-msg' : 'other-display-msg';
    };
}

最佳答案

为了支持虚拟元素 Knockout 使用不识别闭合元素的 DOM 模型。因此,在遍历下一个同级元素时,它找不到结束注释,因此它会像您一样抛出异常。

看看 getVirtualChildren 函数: https://github.com/knockout/knockout/blob/8decc433942d7413b47768e0f45c304e8f15aa09/src/virtualElements.js#L27

关于javascript - knockout JS : Unable to process binding "if: function (){return conversations }",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36375685/

相关文章:

javascript - 1.1、2.-1、2.3.30 等模式的正则表达式

java - 使用 JSoup 从网站获取文本

c# - 在 Chrome 响应式模拟器中重定向更改用户代理

javascript - knockout 映射 - 来自 JS - 一个简单的例子失败

knockout.js - 对 Breeze 导航属性进行排序

javascript - 使用 CefSharp WPF 在 C# 上执行 JavaScript 会导致错误

javascript - 使用 JavaScript 在 <li> 内的 <Input> 元素后面附加文本

javascript - 使用ejs模板设置背景图片

java - 可以将我的本地主机网络服务与模拟器连接,但不能与我的手机连接

javascript - 通过原型(prototype)将计算的可观察对象添加到构造函数