EntityManager.createEntity() - 显示用户输入的生成ID和默认值的策略

时间:2013-06-04 22:50:15

标签: knockout.js breeze

我有2个与1:M关系的人。

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为十进制)。

一旦我将这些实体绑定到“新车辆形式”,这些值会立即显示给用户,而实际上我希望它们为空白... 处理这个问题的最佳方法是什么? 我的一些想法是:

  1. 添加其他属性(通过初始化程序)并使用它们在表单上绑定。然后在保存之前,交换属性。
  2. 在初始化程序(而不是构造函数)中“清除”这些属性....
  3. 可能使用自定义KO绑定处理程序吗?
  4. 有更好的方法吗?

    这是我到目前为止(使用#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不起作用。 在(重新)阅读“Extending Entities”doc(查找“实体创建序列”段落)之后,它特别指出在创建实体和查询时都会调用初始化函数。所以“消灭”Ids,初始化程序中的RetailPrice打破了查询和导入....

1 个答案:

答案 0 :(得分:1)

我会考虑在初始化器中添加一个读/写Knockout(KO)。

&#34;阅读&#34;当值为GUID ...或您设计的任何其他唯一临时值时,计算器的一侧将返回空白。

&#34;写&#34;方(a)确认缓存中没有其他实体具有该密钥,然后(b)用新值覆盖密钥。 &#34;阅读&#34; side现在会显示该值,因为它不再是&#34;临时&#34;。

如果您在任何其他关联中使用这些密钥,您将处于一个受伤的世界;你必须手动修复它们......也许在你的KO计算写入逻辑中。

我假设您已经准备好了用户输入的值与数据库上的另一个键冲突的可能性,由其他用户输入。

我将饶有关于语义键的讲座(如在&#34;不要使用它们&#34;);我想一些遗留数据库让你进入这个位置。