使用属性路径展开时,registerEntityTypeCtor初始值设定项似乎没有触发

时间:2013-05-29 10:03:55

标签: javascript breeze

我希望我的实体中的所有日期类型始终转换为momentjs。我用于此的解决方案(代码2)适用于getResources(代码1),初始化程序是为'事件'和'Shift'实体触发的。但是当我调用getUser时,扩展工作正常,我得到'Order'和'Event'的正确数据,但'Event'的初始化器永远不会触发。有什么想法吗?是因为我正在使用属性路径扩展吗?

另外,如果您能想出更好的解决方案将我的实体中的所有日期类型转换为时刻,我也很乐意接受这一点。

代码1:

var getResources = function () {
    var query = breeze.EntityQuery
        .from("Resources")
        .expand("Event, Shift")
        .orderBy("ResourceId");

    return manager.executeQuery(query)
        .fail(fail);
    }

var getUser = function () {
    var query = breeze.EntityQuery
        .from("LoggedInUser")
        .expand("Order.Event")
        .orderBy("Email");

    return manager.executeQuery(query)
         .fail(fail);
}

代码2:

function configureMetadataStore(metadataStore) {
    metadataStore.registerEntityTypeCtor('Shift', null, momentInitializer);
    metadataStore.registerEntityTypeCtor('Event', null, momentInitializer);
    metadataStore.registerEntityTypeCtor('Order', null, momentInitializer);            
}

function momentInitializer(entity) {
    var newMoment,
        prop;

    for (prop in entity) {
        if (ko.isObservable(entity[prop])) {
            if (entity[prop]() instanceof Date) {
                newMoment = ko.observable(moment(entity[prop]()));
                entity[prop] = newMoment;
            }
        }
    }            
}

1 个答案:

答案 0 :(得分:0)

我确信有一个更好更详细的答案,但从我的理解,你可能试图以给定的格式显示日期,而不是实际在数据库中转换它,对吗?

如果您使用的是Knockout.js之类的绑定处理程序,则只需更改显示的格式,而不是转换日期/时间戳。我总是谨慎地转换日期只是为了展示它们,因为我过去曾遇到过数据库因此而生气的问题。

以下是自定义绑定处理程序的示例,用于将日期时间显示为2013年5月29日,下午2:22:00

ko.bindingHandlers.DateTime = {
    update: function (element, valueAccessor) {
        var value = valueAccessor();
        var date = moment(value());
        var strDate = date.format('MMMM Do YYYY, h:mm:ss a');
        $(element).text(strDate);
    }
};