Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Breezejs定制backingStore适配器_Javascript_Breeze_Single Page Application - Fatal编程技术网

Javascript Breezejs定制backingStore适配器

Javascript Breezejs定制backingStore适配器,javascript,breeze,single-page-application,Javascript,Breeze,Single Page Application,我想知道是否有一种简单的方法可以实现与本机backingStore适配器类似的cutom modelLibrary适配器 基本上,我使用backingStore适配器,因为我不希望我的属性是可观察的。但是,我想添加一些额外的定制;我想将日期值作为momentJS的实例 我只是想知道本机backingStore适配器中是否有任何扩展点,或者是否有其他更简单的方法来完成这项任务。这是一个好问题,但不幸的是,我们在这方面没有太多的文档记录。但是,我们确实有3个模型库适配器,您可以在breeze中查看其

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

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


我只是想知道本机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引起注意。我发布了一个关于这个问题的答案,其中有一些想法