2

私のアプリケーションでは、次のパターンが何度も繰り返されていることがわかりました(以下のコードを参照)。最初のロードではBindMyEvents(true)を呼び出し、その後のデータ取得ではBindMyEvents(false)を呼び出す必要があります。

それは怠惰にロードされるので、データをHTMLソースにシリアル化したくありません。ブールフラグをBind()メソッドに渡すよりも良い方法はありますか?ノックアウトでこれを達成するための標準的なパターンはありますか?

ビューモデル定義内でviewAlertsModel.alerts=nullを設定してから、Bind関数にこれをチェックさせるべきだと考えていました。nullに設定されている場合は、マッピングメソッドを呼び出してからapplyBindings()を呼び出しますか?

function BindMyEvents(initialMap) {
   // get alerts, map them to UI, then run colorbox on each alert        
        $.getJSON("/Calendar/MyEvents/", {},
            function (data) {

                if ( initialMap ) {
                    // set-up mapping
                    viewAlertsModel.alerts = ko.mapping.fromJS(data);
                    ko.applyBindings(viewAlertsModel,$("#alertedEventsContainer")[0]);     

                } else {
                    // update
                    ko.mapping.fromJS(data, viewAlertsModel.alerts);
                }

            }); 
}
4

1 に答える 1

0

別のフローに合わせてコードを再配置します。

最初に-データを一度定義します。

viewAlertsModel.alerts = ko.observable();

次に、データをバインドします

ko.applyBindings(viewAlertsModel,$("#alertedEventsContainer")[0]);

第三に、今あなたのデータで作業します

 $.getJSON("/Calendar/MyEvents/", {},
        function (data) {
                ko.mapping.fromJS(data, viewAlertsModel.alerts);
         });

手順1と2は、初期化フェーズで実行できます。ここで重要なのは、最初viewAlertsModel.alertsにオブザーバブルとして定義することです。

ステップ3は実行時コードです。これで、初期化コードは実行時コードから完全に分離されます。これは、より通常のノックアウトスタイルです。

編集

ko-mappingの使用に関するコメントについては、次のコードを使用します

var tempVar = ko.mapping.fromJS(data);
viewAlertsModel.alerts(tempVar);  // !important - do not use = operator.

これは、ほとんどの人が使用する規則です。ko-mappingの使用は、通常、特殊な状況で使用されます。

于 2011-11-10T02:53:42.303 に答える