我想知道是否有一种简单的方法来实现类似于本机backingStore适配器的cutom modelLibrary适配器。
基本上,我使用backingStore适配器,因为我不希望我的属性成为ko observables。但是,我想添加一些额外的自定义;我想制作momentJS的日期值实例。
我只是想知道本机backingStore适配器中是否有任何扩展点,或者是否还有其他更简单的方法来完成该任务。
答案 0 :(得分:1)
提出了一些解决方案:
1)更改setProperty方法
第一个解决方案是改变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)导入propertyFormatters
这是我结束你使用的解决方案。本质上,我使用registerPropFormatter方法扩展了DataType。
DataType.registerPropFormatter = function(dataType, formatter) {
switch (dataType) {
case DataType.DateTime:
DataType.parseDateFromServer = formatter;
break;
case DataType.DateTimeOffset:
DataType.parseTimeFromServer = formatter;
break;
default:
}
},
基本上,这个方法的作用是,它允许我们为任何类型的受支持的DataType导入自定义格式化程序。
然后,在初始化微风时,我可以简单地注册我的属性格式化程序:
function parseDateAsMoment(source) {
return moment(source);
}
breeze.config.initializeAdapterInstance("modelLibrary", "backingStore", true);
breeze.DataType.registerPropFormatter(breeze.DataType.DateTime, parseDateAsMoment);
答案 1 :(得分:0)
这是一个很好的问题,但遗憾的是我们在这个领域没有多少文献记载。但是,我们确实有3个modelLibrary适配器,您可以在breeze中查看源代码('backingStore','ko'和'backbone'),并且Breeze的设计使得适配器可以插入。
GitHub上的源文件是'b000_breeze.modelLibrary.xxx',其中xxx是适配器的名称。
所以我的建议是创建自己的'backingStoreMoment'适配器作为'backingStoreAdapter'的副本。看看'startTracking'方法。在首次“创建”实体之前,此方法迭代每个实体的每个属性一次。由于您可以从此方法中访问每个'dataProperty'的元数据,因此我认为将任何'DateTime'或'DateTimeOffset'属性包装为MomentJs值应该相当简单。
请回复您的进度,也许我们可以将您的工作添加为另一个微风适配器。