baseViewModel.js
DurandalJS アプリで、他のページからの継承を処理するためのより良い方法を探しています。これが私の現在のアプリ構造です:
- baseViewModel.js
- メインシェル
- グループ 1 シェル
- ページ1
- ページ2
- グループ 2 シェル
- ページ1
- ページ2
- グループ 1 シェル
これらのページはすべて、次のようないくつかの共通機能 (baseViewModel.js) を共有しています。
- isLoading: ページに何かがロードされているかどうかを確認するオブザーバブル
- isValid: フォームが有効かどうかを確認します
- 追加および削除されたアイテムの afterAdd および beforeRemove 効果
- フォームのキーボード ショートカット
- テンプレートスイッチャー機能
- 等
現時点での仕組み
内部のすべては、self が Window オブジェクトへの参照であるように
baseViewModel.js
宣言されています。次に例を示します。self.*
self.showElement = function(elem) { if (elem.nodeType === 1) $(elem).hide().fadeIn(); } self.fadeRemove = function(elem) { if (elem.nodeType === 1) $(elem).fadeOut(500, function() { $(elem).remove(); }); }
メイン シェル内で1 回
baseViewModel.js
だけ定義し、次のようにアプリ全体でアクセスします。<tbody data-bind="foreach: { data: dataArr, afterAdd: showElement, beforeRemove: fadeRemove }">
またはビューモデル内:
Page1.load = function() { self.isLoading(true); // get data };
私が試したこと
プロトタイプの継承を調べて、なんとか機能させることができましたが、実装方法についてはわかりません。Base
内部に関数を作成baseViewModel.js
し、シングルトンとして返しました。次に、ページの1つで、次のことを行いました。
define(['durandal/app', 'jquery', 'knockout', 'baseViewModel'], function (app, $, ko, base) {
var Page1 = function() {};
Page1.prototype = base;
return Page1;
});
Base で宣言された関数は、Page1 のビューとビュー モデルで正常に動作しますが、問題は、Page1 と共に読み込まれたすべてのモジュールで動作する必要があることです。これも:
- グループ 1 シェル ビュー (ベース内の機能をアクティブにするボタンがあります)
isLoading
メイン シェル ビュー (ローディング バーはBase 内の Observableの値に基づいて表示されます)
これらを機能させるには、ファイルを定義し*.prototype = base;
、各ビュー モデルに同じものを適用する必要がありました。
では、継承を処理するためのより良い方法はありますか? そうでない場合、ベースを一度だけ宣言し、それをすべてのサブページに適用する方法はありますか?
ありがとう!