0

そのため、監視可能な配列にコンテンツを追加しようとしていますが、更新されません。問題は最初のレベルのコンテンツではなく、サブ アレイです。小さなコメント欄です。基本的に、私はコメントを宣言するためにこの関数を持っています

function comment(id, name, date, comment) {
    var self = this;
    self.id = id;
    self.name = ko.observable(name);
    self.date = ko.observable(date);
    self.comment = ko.observable(comment);
    self.subcomments = ko.observable([]);
}

idフィールドごとにオブジェクトを取得する関数があります

function getCommentByID(id) {
    var comment = ko.utils.arrayFirst(self.comments(), function (comment) {
        return comment.id === id;
    });
    return comment;
}

ここに私のコメントが表示されます

<ul style="padding-left: 0px;" data-bind="foreach: comments">
    <li style="display: block;">
        <span data-bind="text: name"></span>
        <br>
        <span data-bind="text: date"></span>
        <br>
        <span data-bind="text: comment"></span>
        <div style="margin-left:40px;">
            <ul data-bind="foreach: subcomments">
                <li style="display: block;">
                    <span data-bind="text: name"></span>
                    <br>
                    <span data-bind="text: date"></span>
                    <br>
                    <span data-bind="text: comment"></span>
                </li>
            </ul>
            <textarea class="comment" placeholder="comment..." data-bind="event: {keypress: $parent.onEnterSubComment}, attr: {'data-id': id }"></textarea>
        </div>
    </li>
</ul>

そしてonEnterSubComment問題のイベント形態は

self.onEnterSubComment = function (data, event) {
    if (event.keyCode === 13) {
        var id = event.target.getAttribute("data-id");
        var obj = getCommentByID(parseInt(id));
        var newSubComment = new comment(0, self.currentUser, new Date(), event.target.value);
        obj.subcomments().push(newSubComment);
        event.target.value = "";
    }
    return true;
};

初期化中に(関数の外で)同じ操作を試みると、正常に動作するので興味深いです。

var subcomment = new comment(self.commentID, "name1", new Date(), "subcomment goes in here");
self.comments.push(new comment(self.commentID, "name2", new Date(), "some comment goes here"));
obj = getCommentByID(self.commentID);
obj.subcomments().push(subcomment);

誰かがこれで私を助けることができれば、私はちょっと立ち往生しているので:(

4

1 に答える 1

2

次の 2 つの変更を行う必要があります。

まず、監視可能な配列を宣言する必要があります。

self.subcomments = ko.observableArray([]);

第 2 に、配列メソッドではなく、監視可能な配列メソッドを使用する必要があります。つまり、そうする場合:

obj.subcomments().push(subcomment);

subcommentsが配列として宣言されている場合は、の.pushメソッドを使用することになりArrayます。ただし、監視可能な配列が変更を検出するために必要なことは、observableArrayメソッドを使用することです。つまり、次のようにします。

obj.subcomments.push(subcomment);

observableArray ドキュメントのこの部分を参照してください: ObservableArray の操作:

observableArray は、配列の内容を変更し、リスナーに通知するための使い慣れた一連の関数を公開します。

これらの関数はすべて、基になる配列でネイティブ JavaScript 配列関数を実行し、変更についてリスナーに通知することと同等です。

于 2015-11-29T00:01:06.283 に答える