Breeze registerEntityTypeCtor未调用初始值设定项

Breeze registerEntityTypeCtor未调用初始值设定项,breeze,hottowel,Breeze,Hottowel,我正在学习约翰·帕帕的热毛巾教程,并将其应用于我自己的数据。我想将名为startTime的datetime字段格式化为使用矩格式化的字符串,但甚至没有调用初始化器函数来添加计算字段 在datacontext.js中: var getSessions = function (sessionsObservable) { var query = EntityQuery.from('Sessions').orderBy('startTime', 'title'); return ma

我正在学习约翰·帕帕的热毛巾教程,并将其应用于我自己的数据。我想将名为startTime的datetime字段格式化为使用矩格式化的字符串,但甚至没有调用初始化器函数来添加计算字段

在datacontext.js中:

 var getSessions = function (sessionsObservable) {

    var query = EntityQuery.from('Sessions').orderBy('startTime', 'title');
    return manager.executeQuery(query).then(querySucceded).fail(breezeQueryFailed);

    function querySucceded(data) {
        if (sessionsObservable) {
            sessionsObservable(data.results);
        }
        log('Retrieved Sessions', data, true);
    }
};



function configureBreezeManager() {
    breeze.NamingConvention.camelCase.setAsDefault();
    var mgr = new breeze.EntityManager(config.remoteServiceName);
    model.configureMetadataStore(mgr.metadataStore);
    return mgr;
}
在model.js中:

    function configureMetadataStore(metadataStore) {
    metadataStore.registerEntityTypeCtor('Sessions', null, sessionInitializer);
}


function sessionInitializer(session) {
    session.startDayTime = ko.computed(function () {
        var start = session.startTime();
        return start ? moment.utc(start).format('dddd h:mm a') : '';
    });
}
它返回从API提取的所有数据,但不添加startDayTime计算字段。我在sessionInitializer()函数中放置了一个断点,但它甚至没有到达该断点。我错过了什么?对Breeze 1.4.4的更新是否改变了该操作的方式


谢谢

问题在于您将实体类型注册为“Sessions”(复数)而不是“Session”(单数)。应该是:

 metadataStore.registerEntityTypeCtor('Session', null, sessionInitializer);
“Session”(单数)是实体类型的名称。您可以创建一个具有以下线条的新对象:

var newSession = mgr.createEntity('Session');
“Sessions”(复数)是检索会话实体时所针对的Web API查询资源名称

var query = breeze.EntityQuery.from('Sessions');
这两者很容易混淆。对不起


FWIW,如前所述,您的元数据存储认为它同时具有“会话”实体类型和“会话”实体类型。

您确定它没有被调用吗?将“”更改为“doh”,然后查看该值是否更新。如果不是console.log(session.startTime());确保它有一个值并且没有出错我已经尝试过了,但仍然没有,我在它里面放了一个断点,它从来没有中断过,所以我很确定它没有被调用。控制台确实显示startTime的值。实际上,我正在检查服务器端,以确保所有记录都有有效的开始时间,或者它们甚至没有包含在API数据中。好吧,这里有一个更大的问题-为什么要将格式化逻辑放入一个额外的可观察属性中?如果您使用的是moment and knockout,则无论在何处显示date.True,该逻辑都属于自定义绑定处理程序,并且只要在视图绑定上格式化它就可以了。但是,我仍然想知道,如果我想创建一些计算值进行排序和筛选,为什么它不调用initializer函数。我最好的猜测是,它要么正在被调用,要么失败了,您没有正确设置会话类型,要么startTime由于某种原因没有正确设置为与矩.js一起工作。您显示的代码不在问题所在的位置,我将registerEntityTypeCtor()中的“Sessions”更改为“Session”,但它仍然不起作用。我需要创建一个新的实体吗?应该已经创建了。您确定已按所示修改了注册吗?检查浏览器缓存以确保所做的更改得到反映。检查实体名称是否为“会话”。最后,设置一些断点。注册后,
metadataStore.\u ctorRegistry.Session
应该保存您的
initFn
。在第一次查询后中断,获取元数据存储,并确认“会话”实体在该存储中。我基本上放弃了初始值设定项,现在我正在视图中格式化它,但现在矩抛出了一个错误,因为在它到达视图之前似乎有其他东西正在格式化它。当我用
data bind=“text:startTime”
绑定它时,它的显示方式就像2014年1月8日星期三03:00:00 GMT-0500(东部标准时间)而不是
2013-09-28009:00:00
。Breeze之所以这么做是因为它在元数据中看到了datetime字段吗?我昨天做了这个,但后来“未定义”开始显示,而不是日期,我不知道是什么原因造成的。Breeze不格式化datetime。当日期从服务器到达并且没有时区时,Breeze会添加“z”(GMT)以保持Chrome和FF的快乐。就这样。乔希,我知道你的日子不好过。但是,鉴于您提供的信息与我们所知道的为我们其他人工作的信息相矛盾,我们无法提供帮助。缺少一些重要的细节。你必须为这些问题创建一个微小的复制品,并将其放在我们能够触及的地方(例如GitHub)。很抱歉