12

次のように、div の内容を表す ko.observable を含むビュー モデルがあります。

function claimContainerViewModel(elem, api) {
    this.content = ko.observable('<somecontent>');
}

しばらくして、AJAX 呼び出しを使用してそのコンテンツを更新すると、次のバインディングを持つ div が作成されます。

<div id="ClaimContainer" data-bind="html: content">

「コンテンツ」に対して返された HTML には独自のデータ バインドがあり、これが問題です。これらのバインディングは解析されていません。Knockout および私が読んだすべての情報源によると、これは起こるはずです。「html」バインディングを使用する場合、KO は再バインドを行うのに十分なほどスマートであると想定されています。

これは KO 2.2.0 のバグですか (私がこの瞬間に立ち往生しているバージョン)、それとも html バインディング ハンドラーの動作を誤解していますか? そして、誰かが尋ねる前に、この場合、applyBindings は再バインド自体を処理することになっていると想定している html バインドを使用するため、applyBindings は機能しません (私は KO のコードに踏み込んでこれを確認しました)。

4

1 に答える 1

19

アップデート:

これが私のカスタム バインディングの最終バージョンです。これは自動的に機能し、二重にバインドせず、'html' バインディングと同じように機能しますが、より動的です。

if (!ko.bindingHandlers['dynhtml']) {
    ko.bindingHandlers['dynhtml'] = {
        'init': function() {
            return { 'controlsDescendantBindings': true };
        },
        'update': function (element, valueAccessor, allBindings, viewModel, bindingContext) {
            ko.utils.setHtml(element, valueAccessor());
            ko.applyBindingsToDescendants(bindingContext, element);
        }
    };
}

HTML のソースがわからない場合、これは安全ではない可能性があることに注意してください。非常に、非常に危険です。サニタイズされていないユーザー入力が HTML に入り込む可能性がある場合、これは巨大なセキュリティ ホールになる可能性があるため、クロスサイト スクリプティング攻撃に注意してください。

于 2013-07-19T22:59:24.020 に答える