2010-12-29 4 views
2

私は大きなviewModelを持っています。モデル全体を投稿することなく、ステータスの更新( "未読"/"未読")をサーバーに投稿したいと思います。テンプレートでカスタムバインディングの使い方は?

ko.bindingHandlers.statusUpdater = { 
    update: function(element, valueAccessor) { 
     console.log(element); 
    } 
}; 

私がやったことはそうのようなカスタムバインディングを作成することです

<div data-bind='template: { name: "contactsListTemplate", data: viewModel.conversations.conversationlist }'> </div> 

<script type="text/html" id="contactsListTemplate"> 
<table> 
    <tbody> 
    {{each(i, conversation) $data}} 
    <tr> 
    <td> 
     <input type="checkbox" data-bind="checked: read, statusUpdater: conversation_id" /> 
    </td> 
    </tr> 
    {{/each}} 
    </tbody> 
</table> 
</script> 

カスタムバインディングのために、私はアップデートで唯一の興味、どのようなI私ができることは、KnockoutJSのアップデートを検出し、アイテムIDと新しい統計情報を取得してサーバーにポストするために、更新されたアイテムを判断することです。

何が起こっているのは、customBindingがconsole.logという単一のチェックボックスの変更ですべてのチェックボックスを有効にすることです。これはチェックボックスを変更し、3つすべてのチェックボックスがko.bindingHandlers.statusUpdaterを介してコンソールにログしていることを意味します。

私はデータバインディングにクリックイベントを追加することを考えましたが、カスタムバインディングと同じようには見えませんでした。おそらく私がカスタムバインディングを使ってやろうとしているのは、彼らのためのものではないでしょうか?

思考?

答えて

4

その理由は、モデルメソッドの値が更新されるたびにupdateメソッドが呼び出され、initメソッドが呼び出された後に開始時に呼び出されるためです。

更新バインディングメソッドは、ビューモデルが変更されたときに、バインドされたdom要素の状態を設定するためのものです。

変更に対応してviewModelを更新したい場合は、initメソッドを実装してイベントを添付する必要があります(クリック、変更など)。このハンドラでは、ステータス更新をviewmodelに送信できます。

これを知る最も良い方法は、gitのKOのデバッグバージョンを見ることでした。あなたが達成したいのは、基本的には、ajax呼び出しを伴うチェックバインディングの変更です。

私は上記のテストを行っていませんが、開始する必要があります。

乾杯、

イアン

+0

このためおかげでなく、どのようなビューは、データバインドの内側のようになりますが=「」私は、これがものをknockoutjsにまだドットを接続するように見えることはできません。ありがとう – AnApprentice

関連する問題