4

checkedバインディングに関連付けられたメソッドでバインディングによって更新された値にアクセスするにはどうすればよいclickですか?

バインディングメソッド/ハンドラーでは、バインディングと同期された配列に依存するプロパティ値にアクセスできないため、バインディングはバインディング後にchecked評価されるようです。clickclickcomputedchecked

単一のチェックボックスのテンプレート:

<script id="singleFilterTemplate" type="text/html">
    <li>
        <input type="checkbox" data-bind="attr: { value: id }, 
                                          click: $root.testMethod,
                                          checked: $parent.selectedFilterIds">
    </li>
</script>

ビューモデルの階層をたどっています。

- TopLevelViewModel ($root in template above, defines computed aggregatedSelectedIds property)
---- GroupViewModel_0 ($parent in template above)
-------FilterViewModel_0_0 (Each FilterViewModel is associated with a check box)
-------FilterViewModel_0_N 
---- GroupViewModel_N
-------FilterViewModel_N_0 
-------FilterViewModel_N_N 
  • checked: $parent.selectedFilterIds:チェックボックスがオン/オフになるたび-TopLevelViewModel.selectedFilterIds配列内の適切な項目が更新されます
  • click: $root.testMethod:チェックボックスをクリックしている間、すべてのチェックボックスの現在の状態を取得しようとしています。この目的のためにaggregatedSelectedIds、すべての値の集約された状態を表す、適切に機能する計算プロパティを導入しましたGroupViewModel.selectedFilterIds。基本的には、すべてのselectedFilterIdsプロパティからメタデータを集約します。単一の値に変換し、このプロパティが現在選択されているフィルターのリストを表すことを確認するためtestMethod()に呼び出しています。alert(topLevelViewModel.aggregatedSelectedIds())

testMethod()したがって、バインディングによって呼び出されるたびclickに、フィルターの以前の状態(値、によって計算されますaggregatedSelectedIds)が表示されます。checkedでは、バインドする前にバインドを強制/プッシュ/評価する方法はありますclickか?eventバインドを試みましたが、同じ結果が得られました。おそらく私はこれを間違った方法でやっていて、明らかな何かを逃しましたか?

4

3 に答える 3

4

次のようにして、selectedFilterIds への変更をサブスクライブできます。

this.selectedFilterIds  = ko.observable();
this.selectedFilterIds.subscribe(function (value) {
    //Code from your click method goes here
});
于 2012-04-12T11:48:22.507 に答える
1

チェックボックスをチェックすると、checked イベントと click イベントの両方が基本的に同時にトリガーされるため、ブラウザーはハンドラーの 1 つを最初に起動することを決定するだけなので、クリック ハンドラーでタイムアウトを使用するだけで簡単に修正できます。

のようなものsetTimeout(function() { stuff }, 1)が動作するはずです。

それをクリックハンドラに入れると、ハンドラから「ジャンプ」し、チェックされたハンドラが起動して実行され、その後、タイムアウトコールバックのコードに戻ります(チェックされたハンドラが終了するのに十分な速さであった場合、1ミリ秒待機した後)その前に、私は疑います)

チェックされたハンドラーが他のブラウザーで最初に起動した場合でも、このソリューションは正しく機能します。

于 2012-04-11T21:30:49.890 に答える
0

通常、メソッドは、適切な順序でバインドおよび実行されます。バインドは、最初にクリックをバインドしているように見えます。データバインド属性からでも、knockoutjsがこれをどのように処理するかわかりませんか?

例えば

$(this).click(function () { alert(1);})
    .click(function() {alert(2);});

// alert(1) is first 

私はそれがjqueryであることを認識していますが、純粋なjsのイベントバインディングも同じことをします。

これを行うための本当に最良の方法は、延期または約束を使用することですが、それがknockoutjsでどのように機能するかはわかりません:(

于 2012-04-11T21:28:27.187 に答える