4

何らかの理由で、data-bind = "with:detailedStudent"を使用すると、jQueryのchange()バインディングが呼び出されません。選択オプションを動的に入力していますが、それが問題になるかどうかはわかりません。これは、何が起こっているのかを適切に把握するために使用しているコードの一部です。

var viewModel;
$(document).ready(function() {  
    viewModel = new StudentViewModel();
    ko.applyBindings(viewModel); 

    // this change event is not getting called, but if i put the onchange directly into the html as an attribute, it works fine.
    $("#accountDialog").find("#mySelect").change(function() {
        alert('hi');
    }
}

function Student(data) {
    var self = this;    
    ko.mapping.fromJS(data, {}, this);                
}

function StudentViewModel() {
    var self = this;    
    this.students = ko.observableArray([]);    
    this.detailedStudent = ko.observable(); 
}

<div id="accountDialog" class="modal hide fade" data-bind="with: detailedStudent">
    <select id="mySelect" name="mySelect" data-bind="value: GraduationClassId"></select>
</div>
4

2 に答える 2

5

バインディングはバインディングのwithラッパーtemplateです。子要素をコピーして、テンプレートとして使用します。したがって、detailedStudent変更する場合、KOは、イベントハンドラーがアタッチされていない新しい要素を毎回レンダリングします。

いくつかの選択肢:

  • バインディングを使用してイベントハンドラーをアタッチします(eventバインディングを使用できます)
  • オブザーバブルに対して手動サブスクリプションを作成detailedStudentし、ビューモデルでアクションを実行します(アクションにDOM操作が含まれない場合は最良のオプション)
  • jQueryshttp: //api.jquery.com/on/のような委任されたイベントハンドラーを使用してみて$.on() ください
于 2012-05-30T13:57:55.033 に答える
0

アクションにDOM操作が含まれない場合は、RPNiemeyerに同意します。手動サブスクリプションが最適なオプションです。

ただし、通常は、プロパティにjqueryダイアログ/ datepickerプラグインを設定するなど、DOM操作を伴うイベントが発生します。カスタムバインディングが最良のオプションだと思います。カスタムバインディングは、「with」バインディング句と完全に連携して、任意のjavascript関数にイベントハンドラーを設定します。

あなたはこれを読むことができました、そしてそれはそれがそうであるように思われるほど難しくはありません。 http://knockoutjs.com/documentation/custom-bindings.html

于 2013-06-03T09:45:51.787 に答える