3

私はKnockoutを初めて使用しますが、かなり長い間jQueryを使用しています。私が現在取り組んでいるプロジェクトでは、Knockoutビューモデルを使用しています。

ただし、タブやオーバーレイなどにいくつかのjQueryプラグインも使用します。これらはすべて、KOを使用しない場合、またはコンテナの外部で.を使用して使用する場合に正常に機能しdata-bindます。たとえば、トリガーがKOにバインドされたコンテナー内に配置されている場合、jQueryToolsのオーバーレイプラグインは機能しません。

トリガーされないjQueryイベントの簡単な例を次に示します。

<div data-bind="with: dummyData">
    <a class="alert" href="#">Never fires!</a>
</div>
<div>
    <a class="alert" href="#">Works!</a><br /><br />
    <a href="#" data-bind="click: $root.showHidden">Show hidden link.</a>
</div>

そしてこれがJavaScriptです:

var myViewModel = function () {
    var self = this;
    self.dummyData = ko.observable(false);

    self.showHidden = function () {
        self.dummyData(true);
    };
};

ko.applyBindings(new myViewModel());

$(document).ready(function () {
    $('a.alert').click(function () { alert('Clicked!'); });
});

KOは最初のコンテナーを別のコンテンツに置き換えたり、DOMを更新して、jQueryクリックイベントが機能しなくなったりしますか?

KOには独自のclick:イベントがあることを私は知っています。私はこれを頻繁に使用しますが、特にオブジェクトのクリックイベントにバインドするいくつかのjQueryプラグインでこれを使用したいので、今はクリックイベントをjQueryにバインドできるかどうかを知りたいだけです。

4

2 に答える 2

4

内部的には、KnockoutJSはwithバインディングをバインディングの特殊なケースと見なしていtemplateます。<div data-bind="with: dummyData">ビューモデルのオブザーバブルが変更されるたびに、のすべての子孫が削除および再作成されます。これらのDOM要素が削除されると、jQueryハンドラーも削除されます。.onテンプレートバインディングよりも高いレベルで使用することは、これを回避する1つの方法です。ただし、ノックアウトclickバインディングは私にとってより良い選択のようです。

于 2012-10-15T12:51:51.267 に答える
1

jquery.liveを使用してクリック イベントをバインドします。

$(document).ready(function () {
    $('a.alert').live('click', function () {
        alert('Clicked!');
    });
});

ここにフィドルが働いています:http://jsfiddle.net/fGX3d/3/

于 2012-10-15T12:42:57.347 に答える