2011-10-26 17 views
1

私は、サーバーからデータが2回目に更新されたときにinit:関数が呼び出されないという問題があります。KnockoutJs - なぜinitバインディングハンドラは一度だけ呼び出されますか?

これが発生する理由はありますか?

私はマッピングプラグインを使用しています。私が理解していないもう一つの問題は、これが第1の呼び出しであるか第2の呼び出しであるかに応じて、マッピングプラグインの機能を別々に呼び出す必要があることです。

JS

function ViewMemberPopup(memberId) { 

     $.get("/People/GetMemberDetails?memberId=" + memberId, function (data) {    
      viewMemberModel.model = ko.mapping.fromJS(data);    
      ko.applyBindings(viewMemberModel.model, $("#memberDetailsContainer")[0]); 
     }); 
    } 


// binding handler 
ko.bindingHandlers.renderMemberModal = { 
     init: function (element, valueAccessor, allBindingsAccessor) { 
      $(element).modal("show");    
     } 
    }; 

HTML:私はrenderMemberModal使用しました :結合ハンドラの真の、私はそれに接続されているプロパティを必要とする理由がわかりません。レンダリング関数を呼び出すだけでいいです...

 <div class="modal fade" id="viewMemberModal" data-bind="renderMemberModal: true" style="display: none;"> 
     <div class="modal-header"> 
      <a class="close" href="#">×</a> 
      <h3> 
       Member Details</h3> 
     </div> 
     <div class="modal-body"> 
      <div data-bind="template: { name: 'memberDetailsTemplate' }"> 
      </div> 
     </div> 
     <div class="modal-footer"> 
      <a class="btnx closeModal">Close</a> 
     </div> 
    </div> 

私はモーダルポップアップを表示するためにブートストラップCSSを使用しています。

答えて

2

通常、各更新プログラムの同じ要素にapplyBindingsを呼び出し続けたくありません。これにより、使用するバインディングに応じて複数のイベントハンドラを追加することができます。あなたがそれをするなら、あなたは少なくともko.cleanNodeを要素に呼ぶことを望むでしょう。何かが好きです:

各アップデートでapplyBindingsを呼び出すのではなく、templateバインディング(またはテンプレートバインディングへのラッパーであるコントロールフローバインディング)がコンテンツの更新を処理する方が簡単だと思います。

あなたのviewModelには、あなたのデータを表すための観測可能性があります。次に、その観測値をデータの新しいコピーで更新することができます。

あなたが本当にやりたいことは、あなたのカスタム関数を持っていて、更新関数を呼び出すたびに起動されるように、更新関数を持っていて、メインのオブザーバブルにアクセスすることです。

ko.bindingHandlers.custom = { 
    update: function(element, valueAccessor) { 
     ko.utils.unwrapObservable(valueAccessor()); //just for subscription 
     console.log("hit"); 
    } 
}; 

は次のようになります。

+0

http://jsfiddle.net/rniemeyer/dNsW8/ちょうど通過し、サンプルを理解しようとしています。 ko.mapping.fromJS(dataFromServer、null、viewModel.myData()) - なぜ3つのparams、私はそれが2つかかったと思った?これに関する文書はありますか? – jaffa

+0

また、 '$ data undefined error'が表示されます。 http://pastie.org/2766651。 – jaffa

+0

ko.mapping.fromJSには3つのパラメータがあります。最初はデータ、2番目はマッピングオプション、3番目は更新するオブジェクトです。すでにマッピングされているオブジェクトを扱う場合は、マッピングオプションを再度使用する必要がないため、2番目のパラメータとして渡すことができます。マッピング済みのオブジェクトを渡してマッピングオプションを渡したことを認識します。 –

1

Knockoutjsのサイトhttp://knockoutjs.com/documentation/custom-bindings.htmlでは、カスタムバインディングについて説明しています。

ノックアウトは、バインディングを使用するDOM要素ごとに一度init関数を呼び出します。 - DOM要素の初期状態を設定する - たとえば、ユーザーがDOM要素をクリックまたは変更したときにイベントハンドラを登録するには、DOM要素の状態を変更することができます。関連する観測可能

したがって、設計上、Initはバインディングを設定するために1回しか呼び出されません。 Updateメソッドが正しく動作するようにDOMオブジェクトを設定するのが目的です。

関連する問題