1

サーバーからデータが2回更新されたときに、init:関数が呼び出されないという問題があります。

これが起こるかもしれない理由はありますか?

マッピングプラグインを使用しています。私が理解していないもう1つの問題は、これが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:trueを使用しましたが、プロパティをアタッチする必要がある理由がわかりません。レンダリング関数を呼び出す必要があります...

     <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を使用しています。

4

2 に答える 2

2

通常、更新のたびに同じ要素でapplyBindingsを呼び出し続けることは望ましくありません。これにより、使用するバインディングによっては、複数のイベントハンドラーが追加される可能性があります。それを行う場合は、少なくともko.cleanNode要素を呼び出す必要があります。次のようなもの:http://jsfiddle.net/rniemeyer/F4AzB/

更新のたびにapplyBindingsを呼び出すよりも、templateバインディング(またはテンプレートバインディングのラッパーである制御フローバインディング)にコンテンツの更新を処理させる方が簡単だと思います。

viewModelには、データを表すオブザーバブルが含まれている可能性があります。次に、データの新しいコピーでオブザーバブルを更新できます。

その場合、本当にやりたいのは、カスタムバインディングに更新関数を持たせ、メインのobservableにアクセスして、更新関数を呼び出すたびに起動するようにすることです。

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

次のようになります:http://jsfiddle.net/rniemeyer/dNsW8/

于 2011-10-26T16:02:08.593 に答える
1

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

Knockoutは、バインディングを使用するDOM要素ごとにinit関数を1回呼び出します。initの主な用途は2つあります。-DOM要素の初期状態を設定する-たとえば、ユーザーがDOM要素をクリックまたは変更したときに、関連するオブザーバブルの状態を変更できるように、イベントハンドラーを登録する

したがって、設計上、Initはバインディングを設定するために1回だけ呼び出されます。Updateメソッドが正しく機能するようにDOMオブジェクトを構成することが目的です。

于 2011-10-26T16:02:06.293 に答える