为什么breeze.js不将属性映射为依赖的observables?

时间:2014-06-06 15:55:14

标签: knockout.js breeze hottowel

John Papa的single page app jumpstart tutorial增加了一个名为" isPartial"通过微风确定整个实体是否已加载到缓存中。当我使用Breeze.WebApi版本1.1.3的教程运行它时,一切运行正常。但是,我现在正在使用VS 2013的HotTowel Visual Studio模板(版本1.1)运行教程,我发现在breeze(版本1.4.1)获得"未捕获TypeError时保存实体的问题:boolean不是功能"在breeze.debug.js第15124行。

有问题的一行是试图访问" isPartial"实体上的财产:

    proto.getProperty = function(propertyName) {
        return this[propertyName]();
    };

早期版本和现在版本之间的区别在于" isPartial"属性附加在构造函数中,如下所示:

    metadataStore.registerEntityTypeCtor(
        'Session', function () { this.isPartial = false; }, sessionInitializer);

...该属性是" ko.dependentObservable"。在较新的版本中,它是一个简单的属性。我的猜测是微风引起问题的原因。实际上,似乎当实体首次加载时," isPartial" property也是dependentObservable(并且保存可以正常工作)。但是,在此之后的某个时间它变成了一个简单的属性。

这是一个有效的前一个值的chrome调试镜头。 enter image description here

这是一个不起作用的Chrome调试镜头。 enter image description here

感谢您提供任何线索!

2 个答案:

答案 0 :(得分:0)

尝试将breeze.js升级到版本> = 1.4.4。

the doc 中,它说版本1.4.4解决了Knockout包装错误:

  

修正了淘汰赛中ES5道具的错误并不总是被正确包裹。

答案 1 :(得分:0)

必须有另一种解释。您会在DocCode sample, entityExtensionTests.js中看到与您类似的示例。例如:

test("add unmapped 'isPartial' property via constructor", 6, function () {
    var store = cloneModuleMetadataStore();

    var Customer = function () {
        // These are simple 'field' properties.
        // Breeze converts them to the right kind of properties  
        // for the prevailing modelLibrary adapter
        // such as KO observable properties.
        this.CustomerID = testFns.newGuidComb();
        this.isPartial = true;
    };

    store.registerEntityTypeCtor('Customer', Customer);

    var em = newEm(store);
    var cust = em.createEntity('Customer'); 

    assertExpectedCustomerCtorProperties(cust);
});

function assertExpectedCustomerCtorProperties(cust) {
    var custType = cust.entityType;
    ok(custType,"'cust' is now an entity");

    // Breeze converted both into KO observables
    ok(typeof cust.CustomerID === 'function',
        "'CustomerID' should be a KO observable");

    ok(typeof cust.isPartial === 'function',
        "'isPartial' should be a KO observable");

    if (!custType) {return;} // no remaining tests would pass

    var propInfo = custType.getProperty('CustomerID');
    ok(propInfo && !propInfo.isUnmapped && propInfo.isPartOfKey,
        "'CustomerID' should be detected as a mapped property");

    propInfo = custType.getProperty('isPartial');
    ok(propInfo && propInfo.isUnmapped,
        "'isPartial' should be an unmapped property");

    var unmapped = custType.unmappedProperties;
    ok(unmapped.length === 1,
        "'isPartial' should be the lone unmapped property");

}

你的第二个屏幕截图显然是与第一个不同的实体,因此它无法说服问题在于微风。

我强烈推荐有关扩展实体的文档,特别是有关自定义构造函数和初始化程序中属性之间差异的解释。

IMO,出于您的目的,您需要构造函数中的isPartial属性