0

ここで問題を再現できました: http://jsfiddle.net/NE6dm/

アプリで使用している次の HTML があります。

<div data-bind="foreach: items, jqAccordion: { active: false, collapsible: true }">
        <h3>
            <a href="#" data-bind="text: title"></a>
        </h3>
        <div>    
            hello
        </div> 
</div>
<button title="Click to return to the complaints list." data-bind="click: addItem">Add Item</button>

アイデアは、Knockout observable 配列を介して動的に追加/削除される一連のアイテムのアコーディオンを表示することです。

これが私が使用するJavaScriptコードです。

// Tab.
var tab = function (questionSet) {
    this.id = questionSet.code;
    this.title = questionSet.description;
    this.questionSet = questionSet;
};

カスタム ノックアウト バインディング ハンドラ:

ko.bindingHandlers.jqAccordion = {
        init: function (element, valueAccessor) {
            var options = valueAccessor();
            $(element).accordion(options);
            $(element).bind("valueChanged", function () {
                ko.bindingHandlers.jqAccordion.update(element, valueAccessor);
            });
        },
        update: function (element, valueAccessor) {
            var options = valueAccessor();
            $(element).accordion('destroy').accordion(options);
        }
    };

var NonSequentialViewModel = function () {
    var items = ko.observableArray();

    items.push(new tab({ id: 23, description : 'Added Inline' }));

    var addItem = function() {
        items.push(new tab({ id: 5, description: 'Added by a click' }));
    };

    return {
        addItem: addItem,
        items: items
    }
}

var nonsequentialViewModel = new NonSequentialViewModel();    

ko.applyBindings(nonsequentialViewModel);

問題は次のとおりです。HTML ページを表示すると、「追加されたインライン」という項目が正常に表示され、折りたたんだり展開したりできます。しかし、「アイテムの追加」ボタンをクリックすると、新しいアイテムがアコーディオンに追加されますが、スタイリングはまったくありません。例えば:

ここに画像の説明を入力

上の画像では、最初のアイテムは正しくスタイル設定されていますが、残りのアイテムには jQuery UI スタイルが適用されていません。基本的に、動的に追加されるアイテムには、アコーディオン スタイルは適用されません。

私はこの質問を見ました

アコーディオン メニューを作成するための knockout.js と jQueryUI

質問に含まれているjsFiddleを使用してみましたが、コードが同じ結果にならない理由がわかりません。

他の誰かがこれを以前に経験していて、助けてくれることを願っています。

編集:

これをさらに調べたところ、問題はこれであることがわかりました。新しい項目を監視可能な配列に追加すると、カスタム ハンドラーのupdateメソッドが実行されません。したがって、アコーディオンの再描画は決して起こりません。

を呼び出さない理由がわかりupdateません。これは私の頭をやっているリアルです!:)

編集: ここで問題を再現できました: http://jsfiddle.net/NE6dm/

4

2 に答える 2

1

NonSequentialViewModelコンストラクターはitems配列を返しません。returnステートメントを次のように更新します。

return {
    items: items,
    addItem: addItem
}

ここにフィドルが働いています:http://jsfiddle.net/vyshniakov/MfegM/323/

于 2012-11-29T14:46:55.930 に答える
0

古い質問ですが、私は同じ問題を抱えていたと思います。ノックアウト js にバグを送信する必要がある場合があります。同様の問題を解決するために数時間を費やすだけです。

要するに... jsfiddle をロードしてノックアウトのバージョンを 2.1.0 に変更すると、正常に動作するように見えます。これ:

<script type="text/javascript" src="http://cloud.github.com/downloads/SteveSanderson/knockout/knockout-2.2.0.debug.js"></script>

これに:

<script type="text/javascript" src="http://cloud.github.com/downloads/SteveSanderson/knockout/knockout-2.1.0.debug.js"></script>

(唯一の違いはバージョン 2.2.0 --> 2.1.0)

さらに...私はいくつかのバージョンに落ち着きました: jquery: 1.9.1 jquery-ui (結合): 1.9.2 knockoutjs: 2.1.0

于 2013-02-12T15:43:28.690 に答える