1

1:M の関係を持つ 2 つのエンティティがあります。

Vehicle (Id, RetailPrice, StockOn, VehicleInfoId) and 
VehicleInfo (Id, Year, Make, Model, ICollection<Vehicle>)

両方の ID はユーザー指定 (文字列) ですが、Breeze には (一時的であっても) 一意のキーが必要なため、. でエンティティを作成する必要がありますid = breeze.core.getUuid()。さらに、Year と RetailPrice は 0 に設定されます (Year は int、RetailPrice は 10 進数)。

これらのエンティティを「新しい車両フォーム」にバインドすると、これらの値はすぐにユーザーに表示されますが、実際には空白にしたいのですが...これを処理する最良の方法は何ですか? 私が持っているいくつかのアイデアは次のとおりです。

  1. (初期化子を介して) 追加のプロパティを追加し、それらを使用してフォームにバインドします。次に、保存の直前に、プロパティを交換します。
  2. これらのプロパティをイニシャライザ (コンストラクタではなく) で「一掃」します。
  3. カスタム KO バインディング ハンドラーを使用しますか?

より良い方法はありますか?

これが私がこれまでに持っているものです(#2を使用していますが、これが正しいかどうかはわかりません)

/viewmodels/vehicleadd.js

var vehicle = ko.observable();
var viewModel = {
    title: 'Add New Vehicle',
    vehicle: vehicle,
};
return viewModel;
function activate() {
    vehicle(datacontext.createVehicle());
}

/services/datacontext.js

function init() {
    logger.debug(datacontext, 'Initializing data context...');
    return manager.fetchMetadata()
        .then(model.configureMetadataStore(manager.metadataStore))
        .then(model.applyValidators)
        //.then(loadLookups)
        .fail(initFailed);
}

function createVehicle() {
 var newVehicleInfo = manager.createEntity('VehicleInfo');
 var newVehicle = manager.createEntity('Vehicle');
 newVehicle.vehicleInfo(newVehicleInfo);

 return newVehicle;
}

/services/model.js

function configureMetadataStore(metadataStore) {
    logger.debug(model, 'Configuring metadata store...');
    extendVehicle(metadataStore);
    extendVehicleInfo(metadataStore);
}

function extendVehicle(metadataStore) {
    // --- custom constructor ---
    var vehicleCtor = function () {
        this.id = ko.observable(breeze.core.getUuid()); // must have for Breeze to work...
    };
    // --- initializer ---
    var vehicleInitializer = function (vehicle) {
        // defaults
        vehicle.id(null);                       // user to input
        vehicle.retailPrice(null);              // user to input
        vehicle.stockedOn(moment().format());   // set to current date & time
        // additional, non persisted properties
        vehicle.isBeingEdited = ko.observable(false);
        vehicle.isBeingSaved = ko.observable(vehicle.entityAspect.isBeingSaved);             
    };
    // --- register custom ctor & initializer ---
    metadataStore.registerEntityTypeCtor(EntityNames.Vehicle, vehicleCtor, vehicleInitializer);
}

function extendVehicleInfo(metadataStore) {
    // --- custom constructor ---
    var vehicleInfoCtor = function () {
        this.id = ko.observable(breeze.core.getUuid());
    };
    // --- initializer ---
    var vehicleInfoInitializer = function (vehicleInfo) {
        // defaults
        vehicleInfo.year = ko.observable(moment().format());
        // additional, non persisted properties
        vehicleInfo.isBeingEdited = ko.observable(false);
        vehicleInfo.isBeingSaved = ko.observable(vehicleInfo.entityAspect.isBeingSaved);
        // computed properties
        vehicleInfo.Description = ko.computed(function () {
            return vehicleInfo.year() + ' ' + vehicleInfo.make() + ' ' + vehicleInfo.model();
        });             
    };
    // --- register custom ctor & initializer ---
    metadataStore.registerEntityTypeCtor(EntityNames.VehicleInfo, vehicleInfoCtor, vehicleInfoInitializer);
}

更新 #1

いくつかのテストの後、クエリ時に #2 が機能しないようです。「エンティティの拡張」ドキュメントを(再)読んだ後(「エンティティ作成シーケンス」の段落を探してください)、エンティティの作成時とクエリの両方の場合にイニシャライザ関数が呼び出されることが具体的に述べられています。そのため、イニシャライザで ID や RetailPrice を「一掃」すると、クエリとインポートが中断されます。

4

1 に答える 1