3

私はこの非常に単純なテストビューを持っています

<button data-bind="click: add">Add</button>
<table data-bind="foreach: items">
    <tr>
        <td data-bind="text: name"></td>
        <td><button data-bind="click: $root.remove">Remove</button></td>
    <tr>
</table>

フィドル: http: //jsfiddle.net/6PP5m/

問題は、removeメソッドでのこのコンテキストが、クリックイベントを発生させた子ビューモデルであるということです。

私が好きな解決策を見つけられませんでした。コンストラクターに自己変数を追加して、「this」の代わりにそれを使用できますが、「this」キーワードを使用するためのよりクリーンなコードとOO

フィドル: http: //jsfiddle.net/Qn2CM/

プロキシ関数デリゲートを作成することもできますが、それでもあまりクリーンなコードではありません

フィドル: http: //jsfiddle.net/gYhMr/

どういうわけか、これのコンテキストを正しい正しいスコープ(この場合は$ root)に設定するようにkoに指示したいのですが、それは可能ですか?

4

1 に答える 1

6

クリック/イベントバインディングは、見つけた現在のデータのコンテキストで実行されます。

関数が正しいコンテキストで実行されるようにするためのいくつかのオプションがあります。

  • 正しいthisを次のような変数に設定selfし、ハンドラーで使用します(前述のとおり)
  • ビューモデルのようなものを使用$.proxyして、それが正しいことを確認します(あなたが述べたように).bindthis
  • 次のように関数をインラインでバインドしますdata-bind="click: $root.remove.bind($root)"
  • 次のような(醜い)無名関数を使用するdata-bind="click: function() { $root.remove($data); }"
于 2012-05-24T13:17:43.897 に答える