覆盖 breeze.DataType.parseDateFromServer

override breeze.DataType.parseDateFromServer

我正在尝试覆盖这里描述的 breeze 方法 breezejs: date is not set to the right time 但它似乎根本不会影响它。你有什么想法吗?

breeze.DataType.parseDateFromServer 方法(或其重写实现)将在任何时候调用 breeze 确定传入数据表示日期。 breeze 确定这一点的方式是使用其元数据。

此元数据可用于每个 EntityType,但通常 可用于每个字段投影。换句话说,如果你执行这个查询

var query = EntityQuery.from("Employees")
     .where('birthDate', '>', new Date(1998, 3, 1));

Breeze 将关闭 collection 个 'Employee' 实体,其中 'birthDate' 属性 将通过 parseDateFromServer方法。这是因为 breeze 有关于 'Employee' EntityType 的元数据并且知道 'birthDate' 属性 代表一个日期。

某些逻辑适用于任何涉及 'expand' 或 return 实体的任何属性的 'select' 的查询。即 parseDateFromServer 也在这里调用:

var query = EntityQuery.from("Orders").expand("Employee");

以及此处:

// assuming orderedByEmployee is a property on Order that returns an Employee entity.
var query = EntityQuery.from("Orders").select("orderId, orderedByEmployee");

但是,如果您投影 'loose' 属性,那么 breeze 不知道它们的类型。所以下面的查询:

var query = EntityQuery.from("Employees")
     .select('employeeId, birthDate");

不会通过 parseDateFromServer 传递 'birthDate' 属性,而是 return collection of [=75] =] json objects 每个都有一个数字 'employeeId' 属性 和一个 字符串 'birthDate' 属性。

这个原因是 javascript 的固有原因,因为 json 序列化日期看起来完全像一个字符串,并且无法从数据本身判断某个东西是否看起来像一个字符串字符串(带引号的格式)实际上是一个字符串,或者它是否真的代表一个基础日期:

理论上,breeze 可以尝试通过更仔细地查看数据来推断数据类型,但我们很早就决定不应该尝试 'guess' 这样的事情。我们也可以尝试通过解析和评估投影表达式来确定数据类型,但这增加了一定程度的复杂性,我们认为没有必要。

虽然有一个解决方法。您可以告诉 breeze 正在 return 编辑的数据的结构。您可以通过创建 'projection' entityType 然后告诉 breeze 这是您通过使用 EntityQuery toType 方法投影到的内容来执行此操作。像这样:

var query = EntityQuery.from("Employees")
     .select('employeeId, birthDate")
     .toType("EmployeeProjection");

其中 "EmployeeProjection" 类型定义如下:

var et = new breeze.EntityType({
  shortName: "EmployeeProjection",
  namespace: "MyNamespace"
});
et.addProperty(new breeze.DataProperty({
  name: "employeeId",
  dataType: breeze.DataType.Int32,
}));
et.addProperty(new breeze.DataProperty({
  name: "birthDate",
  dataType: breeze.DataType.DateTime
}));
myEntityManager.metadataStore.addEntityType(et);

在这种情况下,预计结果中的 'birthDate' 属性 将通过 parseDateFromServer

或者,您可以自己手动调用 'parseDateFromServer' 那些您 'know' 是日期的属性。

希望这是有道理的。