使用.select时的Breeze和数据类型

时间:2013-08-15 15:25:09

标签: angularjs breeze

我很好奇是否有人知道为什么在微风查询中添加.Select并且仅返回单个列会导致我的日期字段以不同的方式进行解析?我的想法是两个查询都应返回相同的数据/使用相同的元数据作为我的日期字段。

例如

Retrieving the entity that includes the date:
    function getACase()
    {
        var returnPromise = Q.defer();
       var caseQuery = breeze.EntityQuery
           .from("case")
           .where("pkCaseID", "eq", 1013)
        return Q.delay(0)
            .then(function()
            {
                return manager.executeQuery(caseQuery)
                    .then (function(data)
                    {
                    returnPromise.resolve();
                    return data.results;
                    })
                    .fail(function(){$log.error("CaseData Query Failed")});
            }) ;
        return returnPromise.promise();
    }

CourtDate列转换为日期:(数据库的实际日期是1/1/1950)

enter image description here

Retrieving just the date column from the database:
   function retrieveCourtDate ()
    {
        var returnPromise = Q.defer();
        var query = breeze.EntityQuery
            .from("case")
            .where ("pkCaseID", "eq", 1013)
            .select("CourtDate");
        return Q.delay(0)
            .then(function()
            {
                return manager.executeQuery(query)
                    .then (function(data)
                {
                     returnPromise.resolve();
                    return data.results;
                })
                    .fail(function(){$log.error("Date Query Failed")});
            });
        return returnPromise.promise();
    }

CourtDate未转换:

enter image description here

在屏幕上显示为:enter image description here

1 个答案:

答案 0 :(得分:2)

好的,这是一个错误,但这很痛苦。基本上,当Breeze执行返回任何已知 entityType 的查询时,我们有元数据确定 dataType 对于从服务器返回的json中的每个属性是什么。这是允许我们采用像这样的“1996-07-13T00:00:00.000Z”的json ISO8601序列化日期字符串并将其转换为javascript日期对象: Fri Jul 12 17:00:00 PDT 1996 < /强>

问题在于,当您使用Breeze“select”语句时,从服务器返回的结果是匿名对象,而Breeze不知道此对象上任何属性的数据类型。 Breeze 执行遍历返回对象的所有属性以确定是否存在任何嵌入实体,但它无法确定名为“CourtDate”的属性实际上是日期数据类型(我们可以猜,但还有其他问题)。

对于包含日期的匿名对象,有一个解决方法,因为您知道属性为Dates,您可以调用Breeze的 DataType.parseDateFromServer 方法

  data.results.forEach(function(anon) {
      anon.CourtDate = breeze.DataType.parseDateFromServer(anon.CourtDate);
  }