0

我最近升级到了最新版本的 Breezejs(从 1.3.6 到 1.4.1)。我有一种情况,我从服务器获取实体,我得到类似的东西

{
    "$type": "X.Y.Reference, X.Y",
    "ReferenceTypeId": "BookEdited",
    "ShouldDisplay": true,
    "ShortTitle": "Informationsethik 1995",
    "Title": "Informationsethik",
    "Year": "1995",
    "YearResolved": "1995",
    "CloudProjectSubset": "ReferenceNavigation",
    "Id": "34e1f0d1-eda7-4926-a13f-e75e43ff66b5",
    "ProjectId": "syncproject1"
  },

我希望您注意“ShouldDisplay”属性设置为 true。后来,由于我的应用程序的逻辑,我做了另一个查询,我得到了同一个实体,这次是这样的:

{
    "$type": "X.Y.Reference, X.Y",
    "ReferenceTypeId": "BookEdited",
    "ShortTitle": "Informationsethik 1995",
    "Title": "Informationsethik",
    "Year": "1995",
    "YearResolved": "1995",
    "CloudProjectSubset": "ReferenceNavigation",
    "Id": "34e1f0d1-eda7-4926-a13f-e75e43ff66b5",
    "ProjectId": "syncproject1"
  },

请注意,由于我的逻辑,我不再获得属性“ShouldDisplay”,这是正确的。Breezejs 在每次查询后将实体合并到本地缓存。关键是,在第二个查询之后使用版本 1.3.6 时,我的实体仍然将“ShouldDisplay”设置为 true(这是我想要的),因为第二个查询返回没有该属性的相同实体,然后它不会被覆盖。然而,如果我使用 1.4.1 版,该属性(即使未序列化)无论如何都会被覆盖并设置为 null,这不是我想要的。简而言之,在我看来,在 1.3.6 版本中实际上只覆盖了返回的属性,而不是在 1.4.1 中,所有属性都被覆盖了。在 Breezejs 的网站上或者在网上我没有找到关于这种“合并”行为的信息,只有关于未决更改的合并策略的设置,这不是我现在所面临的。有人知道这是否是 Breezejs 应该工作的方式,还是我缺少一些配置?谢谢你。

4

1 回答 1

0

好的,在调试了Breeze的源代码后,我想通了。我会发布我的解决方案,以防它对某人有用,或者如果他们想检查这是一个功能还是一个错误,可能对 Breeze 人有用。我已经替换了这条线

return val !== undefined ? val : dp.defaultValue;

用这条线

return val;

在 ctor.getRawValueFromServer 和 ctor.getRawValueFromClient 方法中。要点是:当必须合并实体时,会触发一个名为 updateEntity 的方法,该方法会循环遍历目标实体属性并检查它们是否在从服务器获取的原始实体中定义。如果原始实体上的属性值不是“未定义”,则该方法会替换目标实体上的属性。问题是,对于原始代码行(如上所示),如果值为“未定义”,则返回属性的默认值,在我的情况下为“null”,所以我实体的所有属性都是更换。现在它工作正常。我已经对 Breezejs 的最新(截至今天)版本进行了此更正,目前为 1.4.9。希望它可以帮助某人。

于 2014-03-07T07:58:22.687 回答