【问题标题】:Why is breeze.js not mapping properties as dependent observables?为什么breeze.js 不将属性映射为依赖的可观察对象?
【发布时间】:2014-07-27 23:19:06
【问题描述】:

John Papa 的single page app jumpstart tutorial 向其实体添加了一个名为“isPartial”的属性,以确定整个实体是否已被轻风加载到缓存中。当我使用 Breeze.WebApi 1.1.3 版的教程运行它时,一切都运行良好。但是,我现在使用 VS 2013(版本 1.1)的 HotTowel Visual Studio 模板运行本教程,我发现保存实体时出现问题,其中微风(版本 1.4.1)出现“未捕获的类型错误:布尔不是函数”微风.debug.js 第 15124 行。

有问题的行正在尝试访问实体上的“isPartial”属性:

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

早期版本和现在的区别在于,当在构造函数中附加“isPartial”属性时,像这样:

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

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

这是一个有效的之前值的 chrome 调试截图。

这是一个 chrome 调试镜头,它不起作用。

感谢您提供任何线索!

【问题讨论】:

  • 尝试将微风.js 升级到版本 >= 1.4.4。在the doc 中,它说版本 1.4.4 解决了 Knockout 包装错误

标签: knockout.js breeze hottowel


【解决方案1】:

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

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

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

【讨论】:

  • 好主意!我更新到 1.4.4,然后更新到 1.4.13,没有任何区别。不过感谢您的建议。
  • @MikeWitt 值得一试!如果没有进一步的信息,很难获得想法。是一步步跑教程的时候遇到这个问题还是适应了自己的情况?
  • 在第一次通过(有效)时,我一步一步按照教程进行操作。在这个过程中,我替换了其他想法(不同的实体),但概念是相同的。我可能会采用第一个有效的方法并将它的 nuget 包升级到较新的版本(尽管原始版本是 Durandal 1.0,而新版本是 2.0,所以这会增加一些工作量)。再次感谢。
【解决方案2】:

必须有另一种解释。您将在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 属性

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2017-06-02
    • 2013-02-12
    相关资源
    最近更新 更多