0

私は John Papa による CodeCamper Pluralsight の例をベースとして使用しています (Durandal フレームワークは、始めるのに最適なプロジェクトです)。
私は顧客エンティティを持っており、エンティティのデータの一部を取得するだけのパーシャルに類似した顧客のリストを表示したいと考えています。違いは、顧客エンティティの一部ではない追加のフィールドを取得/表示したいということです。例: 1) 年間の総売上 2) 顧客の最終注文日。

クライアントで「顧客」の定義を拡張し、このデータをそこに保存したいと思います。そうすれば、たとえば顧客の詳細に移動して顧客名を更新すると、データがローカル キャッシュから取得されるため、顧客リストに戻ったときに変更が反映されます。

ただし、変更を保存するときに、これらの拡張プロパティ (総売上高と最終注文日) が顧客モデルに存在しないため、問題が発生しないことも確認する必要があります。

これは可能ですか?私は DTO について少し知っていますが、それでいいのでしょうか? メタデータで参照されていないプロパティを動的に追加できますか?それとも問題が発生しますか?

ありがとう

4

1 に答える 1

0

私は最近同様の問題を抱えていたので、少し即興で作りました。

あなたの例に従うなら、私は最初にすべての顧客を取得し、それらを という名前の に保存しましobservableArray()customers

その後、顧客オブジェクトをパラメーターとして取り、顧客オブジェクトに依存するその他のプロパティを作成する関数を作成しました。「私の顧客」は属性としていくつかの外部キーを持っていたため、外部キーを解決するためにこの動作が必要でした。それを達成する最も簡単な方法は、を使用することだと思いますko.computed。計算されたものは、顧客属性に基づいて外部キーを解決できます。

私の関数は次のようになります。

function ExtendedCustomer(customerValue) {
    var self = {};
    self.customer = customerValue;
    self.department= ko.computed(function() {
        read: function(){
            return getString(self.customer.Department()).StringValue();
        },
        write: function(newValue){
            var newString = createString(newValue);
            self.customer.Department(newString.StringID());
        }
    });
    self.description= ko.computed(function() {
        read: function(){
            return getString(self.customer.Description()).StringValue();
        },
        write: function(newValue){
            var newString = createString(newValue);
            self.customer.Description(newString.StringID());
        }
    });
    ...
    return self;
}

この関数は、顧客とその他のプロパティを含むオブジェクトを返します。取得したすべての顧客に対してこの関数を呼び出し、別の場所に保存しますobservableArray()

var helper = ko.observableArray()
for (var i = 0; i < customers().length; i++) {
            helper.push(ExtendedCustomer(customers()[i]));
}

次に、元の顧客にバインドする代わりに、拡張された顧客にバインドしていました。

計算されたものは、顧客エンティティに基づいていくつかのプロパティを作成し、この追加されたプロパティのいずれかが変更された場合に顧客エンティティを変更する機能を提供してくれました。

私がこれを選択したのは、これらの拡張オブジェクトが私のビューモデルの 1 つだけに必要だったからです。複数のビューモデルでそれらが必要な場合は、この拡張オブジェクトを上位レベルでスコープして、ビューモデルに共通にすることができます。

複数のビューモデルにスコープする必要がある場合は、John Papa のコースの例に従って、DTO をエンティティにマッピングすることで顧客エンティティにプロパティを追加することもできます。このようにすると、別の vm でアクセスしたい場合に簡単になります。唯一の欠点は、多くのプロパティを追加する (または外部キーを解決する) 必要がある場合、John Papa の例に従えば、データサービスに多くの機能が必要になることです。これをメディエータ オブジェクトに移動する必要があります。

于 2013-10-16T15:09:39.583 に答える