当使用属性路径扩展时,registerEntityTypeCtor初始化器似乎不会触发

registerEntityTypeCtor initializers does not seem to trigger when using property path expand

本文关键字:初始化 registerEntityTypeCtor 属性 路径 扩展      更新时间:2023-09-26

我希望实体中的所有Date类型始终转换为momentjs。我为此使用的解决方案(代码2)适用于getResources(代码1),为'Event '和'Shift'实体触发初始化器。但是当我调用getUser扩展工作,因为它应该,我得到正确的数据为'订单'和'事件',但'事件'的初始化器从未触发。知道为什么吗?是因为我使用了属性路径展开吗?

另外,如果你能想出一个更好的解决方案,把我实体中的所有Date类型转换为moments,我也很乐意接受。

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

我相信有一个更好的和更详细的答案,但据我所知,你可能试图在给定的格式显示日期,而不是实际转换它在数据库中,正确的?

如果你正在使用绑定处理程序,如Knockout.js,你可以改变它显示的格式,而不是转换日期/时间戳。对于转换日期只是为了显示它们,我总是很谨慎,因为我过去遇到过这样的问题,数据库对我很生气。

下面是一个自定义绑定处理程序的例子,显示日期时间为May 29, 2013, 2:22:00 pm

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