Datetime 在breeze对象定义中使用breeze.DataType.parseDateFromServer

Datetime 在breeze对象定义中使用breeze.DataType.parseDateFromServer,datetime,breeze,durandal,Datetime,Breeze,Durandal,我在durandal项目工作,使用breeze。 我将服务器(c#)对象从sql检索到c#类,它进入一个看起来与c#类完全相同的breeze对象。 当我使用数据类型“date time”在breeze对象属性中定义时,它没有正确地将c#的日期时间转换为breeze的日期时间。 我检查并发现问题: 当它达到这一点时,它不起作用: function\uu isDate(o){ return uu classof(o)==“date”&&!isNaN(o.getTime()); } 在观察窗口中,我

我在durandal项目工作,使用breeze。 我将服务器(c#)对象从sql检索到c#类,它进入一个看起来与c#类完全相同的breeze对象。 当我使用数据类型“date time”在breeze对象属性中定义时,它没有正确地将c#的日期时间转换为breeze的日期时间。 我检查并发现问题: 当它达到这一点时,它不起作用:

function\uu isDate(o){
return uu classof(o)==“date”&&!isNaN(o.getTime());
}
在观察窗口中,我看到:_classof(o)=>返回“string”

所以我查看了您的站点,发现有使用breeze.DataType.parseDateFromServer的选项。 但是我不想在javascript逻辑中使用它,因为在它将c#对象输入到breeze对象后,没有正确地转换它,我丢失了原始日期,现在这个选项帮不了我。 所以我想在breeze对象中使用此选项

这是我的密码:

addEmployeePersonalDetailsType(存储);
函数addEmployeePersonalDetailsType(存储){
store.addEntityType({
简称:“EmployeePersonalDetailsTo”,
命名空间:“eHarmonyServer.Entities”,
isComplexType:true,
数据属性:{
生日:{dataType:dataType.DateTime,isPartOfKey:false,验证器:[Validator.date()]},
EmmigRationalDate:{dataType:dataType.DateTime,isPartOfKey:false},
作业代码:{dataType:dataType.Int32,isPartOfKey:false},
ChildCount:{dataType:dataType.Int32,isPartOfKey:false,isNullable:false},
str_作业代码:{dataType:dataType.String,isPartOfKey:false},
str_MaritalStatus:{dataType:dataType.String,isPartOfKey:false},
验证器:[Validator.double()]
},
});
store.registerEntityTypeCtor(“EmployeepersonalDetailsTo”,null,null);
}
我想写:

emmigtiondate:{dataType:dataType.parseDateFromServer,isPartOfKey:false},
但parseDateFromServer是一个函数,它需要接受一个名为“source”的参数。我应该送什么? 或者-你有其他方法来解决这个问题吗? 非常感谢你的比赛

model.js文件中的类示例:

addemployeemain数据类型(存储);
函数addEmployeeMainDataType(存储){
store.addEntityType({
简称:“EmployeeMainDTO”,
命名空间:“eHarmonyServer.Entities”,
isComplexType:true,
数据属性:{
名字:{dataType:dataType.String,isNullable:true,isPartOfKey:false,验证器:[Validator.required()]},
昵称:{dataType:dataType.String,isNullable:true,isPartOfKey:false},
LastName:{dataType:dataType.String,isNullable:true,isPartOfKey:false,验证器:[Validator.required()]},
PassportNo:{dataType:dataType.String,isNullable:true,isPartOfKey:false},
Date_start:{dataType:dataType.DateTime,isNullable:true,isPartOfKey:false,验证器:[Validator.required()]},
日期(完){
dataType:dataType.DateTime,isNullable:true,isPartOfKey:false,验证器:[Validator.date()
,validationHelper.complexTypeEndDateGreaterThanStartDateValidator({
startDateFieldName:“开始日期”,resourceId:“1732”,
entityName:“employeeTblData”,
entityNameSub:“employeeMainData”
})]
},
HourPrice:{dataType:dataType.Double,isNullable:true,isPartOfKey:false},
xActive:{dataType:dataType.Boolean,isNullable:false,isPartOfKey:false},
BalanceCalc:{dataType:dataType.Boolean,isNullable:false,isPartOfKey:false}
}
});
store.registerEntityTypeCtor(“EmployeeMainDTO”,null,employeeMainDataInit);
}
正如您所看到的,我有多个类型为“dateTime”的属性:Date\u start,Date\u end。 我还有几个类,它们也有dateTime类型的属性。 因此,建议我为date类型的每个字段编写初始化函数的解决方案对我来说并不好。 我要的不是写:

Date\u start:{dataType:dataType.DateTime,isNullable:true,
Date_end:{dataType:dataType.DateTime,isNullable:true,
您将给我另一种类型来编写,我只需要在代码中添加一个转换器函数,它将是通用函数,与特定字段名无关,如“生日”、“数据结束”等。

在model.js中(或者在客户端定义模型时,您如何称呼它),您在初始化时执行以下操作:

//...
metadataStore.registerEntityTypeCtor('MyClass', null, myClassInitializer);
//...

function myClassInitializer(myClassInstance){
  myClassInstance.formattedDate = ko.computed({
    read: function () {
      return moment(myClassInstance.date()).format('YYYY-MM-DD');
    },
    write: function (value) {
      myClassInstance.date(moment(value).toDate());
    }
  });
}
然后您只需使用
formattedDate
而不是
date
。显然,您需要将其转换为变量名。来自knockout的双向绑定确保您的
date
formattedDate
始终同步。希望您能理解这点。

在model.js中(或者,无论您在客户端定义模型时如何称呼它)您在初始化时执行以下操作:

//...
metadataStore.registerEntityTypeCtor('MyClass', null, myClassInitializer);
//...

function myClassInitializer(myClassInstance){
  myClassInstance.formattedDate = ko.computed({
    read: function () {
      return moment(myClassInstance.date()).format('YYYY-MM-DD');
    },
    write: function (value) {
      myClassInstance.date(moment(value).toDate());
    }
  });
}

然后您只需使用
formattedDate
而不是
date
。显然,您需要将其转换为变量名。来自knockout的双向绑定确保您的
date
formattedDate
始终同步。希望您能理解这一点。

另一个答案假设您使用的是form.js设置日期。Moment是一个优秀的库,您一定要使用它,但要小心将视图格式逻辑放入模型定义或初始化中。处理您尝试执行的操作的正确方法是使用自定义绑定处理程序,该处理程序处理您的表示逻辑以显示da
<span data-bind="Date: myDate"></span>
 breeze.DataType.parseDateFromServer = function (source)
    {
        var _localTimeRegex = /.\d{3}$/;
        if (typeof source === 'string') {
            // convert to UTC string if no time zone specifier.
            var isLocalTime = _localTimeRegex.test(source);
            source = isLocalTime ? source + 'Z' : source;
        }
        source = new Date(source);
        return source;
    }