customJsonResultsAdapter
上記のコメントによると、このアプローチを使用する場合、Breeze がすべてのナビゲーション プロパティなどを接続するのを見逃していました。基本的に、すべてのエンティティ プロパティを Knockout オブザーバブルにするオーバーヘッドなしで、Breeze の優れた機能を実現したいと考えていました (必要になるまでは)。
編集:以前のカスタム modelLibrary アプローチのバグにより、2 つのユーティリティ関数を使用するように回答が変更されました
代替ソリューションとして、組み込みの Breeze backingStore
modelLibraryアダプターを使用するように変更し、必要に応じて個々のエンティティKnockoutを監視できるようにする関数をいくつか追加しました。これの結果は次のとおりです。
- これは「軽量」なアプローチであり、読み取り専用データに最適です。
- Breezeは、これらのプロパティへの変更をインターセプトし、通常どおり追跡します。
- Knockout を使用してライトエンティティをバインドすることはできますが、プロパティはデフォルトでは監視できないため、プロパティ値が変更されても Web ページは更新されません。
ユーザーがエンティティを編集したい場合は、次のようにします...
function startEditing(entity, uiElement) {
if (!breeze.utils.isObservable(entity)) {
breeze.utils.makeObservable(entity);
ko.applyBindings(entity, uiElement);
}
いくつかの重要な注意事項:
applyBindings
プロパティの変更が Knockout をトリガーして UI を更新するように、エンティティを監視可能にした後に再設定する必要があります。
- 私たちの makeObservable 関数はSteve Sanderson の ES5 プラグインを使用するため、マークアップ バインディングでは括弧は必要ありません (ただし IE9+ に限定されます)。
以下のカスタム関数のコードを含めました。上記の Knockout、Breeze、および Steve のプラグインをロードした後、このコードを含める必要があります。
// Add a function to make an individual Breeze entity observable.
// Requires the Knockout ES5 plugin from http://blog.stevensanderson.com/2013/05/20/knockout-es5-a-plugin-to-simplify-your-syntax/
// Note: Breeze must be configured to use it's built in backingStore adapter:
// breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);
(function () {
var utils = breeze.utils = breeze.utils || {};
utils.makeObservable = function (entity) {
var bs = entity && entity._backingStore;
if (!bs) {
throw new Error("Only entities provided by the backingStore adapter can be made observable");
}
ko.track(bs);
};
utils.isObservable = function (entity) {
var result = false,
bs = entity && entity._backingStore;
if (bs) {
var propNames = Object.getOwnPropertyNames(bs);
if (propNames.length > 0) {
result = !!ko.getObservable(bs, propNames[0]);
}
}
return result;
};
})();