通过 JSON 的 Ext.data.proxy.Ajax 和 WCF 服务

发布于 2024-12-18 08:51:17 字数 2130 浏览 8 评论 0原文

我正在尝试使 ExtJs 与运行 WCF RIA 服务并启用 JSON 端点的后端一起使用。我的后端使用 GetXXX 来读取数据,并使用 CommitChanges 来创建/更新/删除数据。它也没有 ExtJs 标准消息格式,因此我定义了如下存储类:

function cloneObject(src, dst) {
    for (var key in src)
    {
        dst[key] = src[key];
    }


    return dst;
}


Ext.define('MyApp.store.Items', {
    extend: 'Ext.data.Store',
    model: 'MyApp.model.Tax',
    autoLoad: true,
    autoSync: true,    


    proxy: {
        type: 'ajax',
        api: {
            read: '/MyApp/MyAppWeb-Web-MyAppDomain.svc/JSON/GetItems',
            update: '/MyApp/MyAppWeb-Web-MyAppDomain.svc/JSON/SubmitChanges',
            create: '/MyApp/MyAppWeb-Web-MyAppDomain.svc/JSON/SubmitChanges',
            destroy: '/MyApp/MyAppWeb-Web-MyAppDomain.svc/JSON/SubmitChanges'
        },
        reader: {
            type: 'json',
            root: 'GetItemsResult.RootResults',
            successProperty: null,
            totalProperty: 'GetItemsResult.TotalCount'
        },


        writer: {
            type: 'json',
            root: 'changeSet',
            currentOperation: null,


            getRecordData: function(record) {


                var changeSet = [];
                var entity = { 
                    Id: 0, 
                    Operation: 3,
                    Entity: { 
                        __type: 'Items:#MyApp.Web' 
                    },
                    OriginalEntity: {
                        __type: 'Items:#MyApp.Web' 
                    }
                };


                cloneObject(record.data, entity.Entity);
                cloneObject(record.raw, entity.OriginalEntity);
                changeSet.push(entity);


                return changeSet;
            }
        }
    }
});

为了适应 Microsoft JSON 端点格式,我必须重写 getRecordData 并创建自定义 JSON 对象。我也许可以用合并函数替换cloneObject函数,对吗? (我对 ExtJs 还比较陌生,所以可能我想在这里“发明一辆自行车”。

它或多或少按照预期进行更新,但是对于创建和删除,我需要创建稍微不同的消息格式。不同的操作代码,不需要发送 OriginalEntity。但是,在 getRecordData 中,我没有关于正在执行哪种操作的信息,所以问题#1

这里最好的方法是什么?或者还有其他方法吗?问题

#2之后。任何更新标准存储类都会调用 reader 来解析响应,但更新的响应与 GetItems 的响应非常不同,我不知道如何处理

该问题 ,或者如何处理该问题。服务?

I'm trying to make ExtJs work with backend running WCF RIA services with JSON endpoint enabled. The backend I have uses GetXXX for read data and CommitChanges for create/update/delete data. It also has not ExtJs standard message format, so I have store class defined like this:

function cloneObject(src, dst) {
    for (var key in src)
    {
        dst[key] = src[key];
    }


    return dst;
}


Ext.define('MyApp.store.Items', {
    extend: 'Ext.data.Store',
    model: 'MyApp.model.Tax',
    autoLoad: true,
    autoSync: true,    


    proxy: {
        type: 'ajax',
        api: {
            read: '/MyApp/MyAppWeb-Web-MyAppDomain.svc/JSON/GetItems',
            update: '/MyApp/MyAppWeb-Web-MyAppDomain.svc/JSON/SubmitChanges',
            create: '/MyApp/MyAppWeb-Web-MyAppDomain.svc/JSON/SubmitChanges',
            destroy: '/MyApp/MyAppWeb-Web-MyAppDomain.svc/JSON/SubmitChanges'
        },
        reader: {
            type: 'json',
            root: 'GetItemsResult.RootResults',
            successProperty: null,
            totalProperty: 'GetItemsResult.TotalCount'
        },


        writer: {
            type: 'json',
            root: 'changeSet',
            currentOperation: null,


            getRecordData: function(record) {


                var changeSet = [];
                var entity = { 
                    Id: 0, 
                    Operation: 3,
                    Entity: { 
                        __type: 'Items:#MyApp.Web' 
                    },
                    OriginalEntity: {
                        __type: 'Items:#MyApp.Web' 
                    }
                };


                cloneObject(record.data, entity.Entity);
                cloneObject(record.raw, entity.OriginalEntity);
                changeSet.push(entity);


                return changeSet;
            }
        }
    }
});

As you can in order to accomodate Microsoft JSON endpoint format I had to override getRecordData and create custom JSON object. I can probably replace cloneObject function with merge function, right? (I'm still kind of new to ExtJs, so may be I'm trying to "invent a bicycle" here.

It works more or less as expected for update, however for create and delete I need to create slightly different message format. Different Operation code and no need to send OriginalEntity. However inside getRecordData I don't have information about what kind of operation is being performed. So question #1

What is the best approach here? Override 'write' method as well or is there another way?

Question #2. After any update standard store class would call reader in order to parse response, but response for update is very different then response for GetItems and I have no idea how to handle that.

Any suggestions or links to walk-through on how to tie ExtJs and Domain Services?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

面犯桃花 2024-12-25 08:51:17

我最终重写了 Proxy 类以添加对读/写操作的不同解析的支持。效果很好。如果其他人遇到同样的问题,请告诉我 - 我将发布代码示例。

I ended up re-writing Proxy class to add support for different parsing for read/write operations. Works pretty well. Let me know if somebody else faces same problems - I will post code samples.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文