Breezejs自定义backingStore适配器

时间:2014-01-16 16:12:03

标签: javascript breeze single-page-application

我想知道是否有一种简单的方法来实现类似于本机backingStore适配器的cutom modelLibrary适配器。

基本上,我使用backingStore适配器,因为我不希望我的属性成为ko observables。但是,我想添加一些额外的自定义;我想制作momentJS的日期值实例。

我只是想知道本机backingStore适配器中是否有任何扩展点,或者是否还有其他更简单的方法来完成该任务。

2 个答案:

答案 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值应该相当简单。

请回复您的进度,也许我们可以将您的工作添加为另一个微风适配器。