1

Breeze はすばらしいですが、結果セットが大きいとメモリの問題が発生します。私は何を達成したいのかという考えを持っており、最善のアプローチについての考えを大切にしています...

  • 特別な (大きな) 結果セットの場合、Breeze に通常のようにサーバー サービスに対してクエリを実行させたいのですが、それらの結果をエンティティに変換するのではなく、余分な「Breeze」JSON を取り除き、JavaScript オブジェクトのプレーンなリストを取得します。 (理想的には、クライアントに合わせてプロパティのケーシングを変更します)。

  • 次に、これらの結果を ObservableArray に入れ、Knockout を使用してバインドできますが、各プロパティを監視または追跡するオーバーヘッドはありません。

  • ユーザーがレコードを編集したいことを示した場合、適切な Breeze エンティティを作成し、プレーンな Javascript オブジェクトの代わりに ObservableArray にスプライスすることができます。プロパティ名が正確に一致している限り、Knockout バインディングは賢明ではありません。

  • その後、Breeze は変更を追跡し、実際に編集される少数のレコードを通常どおりに保存できます。

Breeze の価値の一部を保持しながら、これらの大きな結果セットのオーバーヘッドを回避したいと考えています。具体的には、可能であれば、カスタム (Breeze 以外の) サーバー側コントローラー メソッドを作成することは避けたいと考えています。

これを達成するために Breeze に侵入するのに最適な場所を誰か提案できますか? (またはより良いアプローチ)

コメントありがとうございます。

4

2 に答える 2

0

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;
    };

})();
于 2013-06-12T05:16:49.810 に答える