Ext.data.proxy.Ajax и WCF сервисы через JSON - PullRequest
0 голосов
/ 29 ноября 2011

Я пытаюсь заставить ExtJ работать с бэкендом, на котором работают службы WCF RIA с включенной конечной точкой JSON.Бэкэнд, который у меня есть, использует GetXXX для чтения данных и CommitChanges для создания / обновления / удаления данных.Он также не имеет стандартного формата сообщений ExtJ, поэтому у меня есть класс хранилища, определенный следующим образом:

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 на функцию слияния, верно?(Я все еще новичок в ExtJ, поэтому, может быть, я пытаюсь «изобрести велосипед» здесь.

Он работает более или менее, как ожидается, для обновления, однако для создания и удаления мне нужносоздайте немного другой формат сообщения. Другой код операции и нет необходимости отправлять OriginalEntity. Однако внутри getRecordData у меня нет информации о том, какая операция выполняется. Так что вопрос № 1

Каков наилучший подход здесьПереопределить также метод «write» или есть другой способ?

Вопрос № 2. После любого обновления стандартный класс хранилища будет вызывать Reader для анализа ответа, но ответ на обновление сильно отличается от ответа для GetItems.и я не знаю, как с этим справиться.

Есть ли какие-либо предложения или ссылки для ознакомления о том, как связать ExtJ и доменные службы?

1 Ответ

0 голосов
/ 03 марта 2012

В итоге я переписал класс Proxy, чтобы добавить поддержку разборов для операций чтения / записи. Работает довольно хорошо. Дайте мне знать, если кто-то еще сталкивается с такими же проблемами - я опубликую примеры кода.

...