Javascript Breezejs定制backingStore适配器
我想知道是否有一种简单的方法可以实现与本机backingStore适配器类似的cutom modelLibrary适配器 基本上,我使用backingStore适配器,因为我不希望我的属性是可观察的。但是,我想添加一些额外的定制;我想将日期值作为momentJS的实例Javascript Breezejs定制backingStore适配器,javascript,breeze,single-page-application,Javascript,Breeze,Single Page Application,我想知道是否有一种简单的方法可以实现与本机backingStore适配器类似的cutom modelLibrary适配器 基本上,我使用backingStore适配器,因为我不希望我的属性是可观察的。但是,我想添加一些额外的定制;我想将日期值作为momentJS的实例 我只是想知道本机backingStore适配器中是否有任何扩展点,或者是否有其他更简单的方法来完成这项任务。这是一个好问题,但不幸的是,我们在这方面没有太多的文档记录。但是,我们确实有3个模型库适配器,您可以在breeze中查看其
我只是想知道本机backingStore适配器中是否有任何扩展点,或者是否有其他更简单的方法来完成这项任务。这是一个好问题,但不幸的是,我们在这方面没有太多的文档记录。但是,我们确实有3个模型库适配器,您可以在breeze中查看其源代码(“backingStore”、“ko”和“主干”),并且breeze的设计使适配器是可插拔的 GitHub上的源文件是“b000\u breeze.modelbrary.xxx”,其中xxx是适配器的名称 所以我的建议是创建您自己的“BackingStore矩”适配器作为“backingStoreAdapter”的副本。请看一下“startTracking”方法。在第一次“创建”实体之前,此方法对每个实体的每个属性迭代一次。由于您可以从该方法中访问每个“dataProperty”的元数据,因此我认为将任何“DateTime”或“DateTimeOffset”属性包装为MomentJs值应该是相当直接的
请发回你的进度,也许我们可以添加你的工作作为另一个微风适配器 A提出了一些解决方案: 1) 更改setProperty方法 a提出的第一个解决方案是更改setProperty方法;所以基本上我检查传入值是否是Date的一个实例,在这种情况下,我将它转换为一个矩实例
proto.setProperty = function (propertyName, value) {
//if (!this._backingStore.hasOwnProperty(propertyName)) {
// throw new Error("Unknown property name:" + propertyName);
//}
var val = value instanceof Date ? moment(value) : value;
this[propertyName] = val;
// allow setProperty chaining.
return this;
};
我不喜欢这个解决方案有几个原因。首先,每次设置属性值时都执行附加检查;此外,我们可以传递一个字符串实例作为date属性的值,在这种情况下,我们需要添加一些额外的逻辑来确定值的类型。最后,我们可能还想将相同的逻辑添加到其他适配器中,因此我们最终将重复自己的操作
2) 重写DataType.parseDateFromServer方法
第二个解决方案是传递DataType.parseDateFromServer方法的自定义实现。也就是说,在我应用几个breeze配置的函数中,我添加了以下代码行:
function parseDateAsMoment(source) {
return moment(source);
}
breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);
breeze.DataType.parseDateFromServer = parseDateAsMoment;
3) 导入属性格式
这就是我最后使用的解决方案。本质上,我使用registerPropFormatter方法扩展了数据类型
DataType.registerPropFormatter = function(dataType, formatter) {
switch (dataType) {
case DataType.DateTime:
DataType.parseDateFromServer = formatter;
break;
case DataType.DateTimeOffset:
DataType.parseTimeFromServer = formatter;
break;
default:
}
},
基本上,这个方法的作用是,它允许我们为任何类型的受支持数据类型导入自定义格式化程序
然后,在初始化breeze时,我可以简单地注册我的属性格式化程序:
function parseDateAsMoment(source) {
return moment(source);
}
breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);
breeze.DataType.registerPropFormatter(breeze.DataType.DateTime, parseDateAsMoment);
我可以通过修改breezeJS源代码来解决这个问题;但这并不是一个理想的解决方案。如果你知道去哪里找的话,API文档对如何创建自己的API提供了一些提示。我相信关键在于使用实体原型的getProperty和setProperty,并定义如何“截取”值,但可能比这复杂得多+1引起注意。我发布了一个关于这个问题的答案,其中有一些想法