Магазин / прокси ExtJS не отправляет метод удаления на сервер - PullRequest
0 голосов
/ 15 марта 2012

Я пытаюсь создать простое приложение ExtJs, которое управляет пользователями и ролями пользователей.Набор сервисов REST предоставляет эту функциональность на серверной части.Когда я назначаю новую роль пользователю, соответствующее хранилище данных отправляет запросы POST (создание) в службу.Однако когда я удаляю существующую роль из пользователя, она удаляется только из хранилища локально, без отправки запроса DELETE в службу.Вот мой код:

Модель:

Ext.define('UserRole', {
    extend: 'Ext.data.Model',
    fields: [
        { name: 'Id', mapping: "Id" },
        { name: 'RoleId', mapping: "RoleId" },
        { name: 'UserId', mapping: "UserId" }
    ]
});

Магазин с прокси:

Ext.define('UserRoleStore', {
    extend: 'Ext.data.Store',
    model: 'UserRole',

    autoload: false,

    proxy: {

        type: 'ajax',
        reader: {
            type: 'json',
            root: 'd.results'
        },        
        api: {
            read: '/accessmanager.svc/Users(\'{userid}\')/Roles?$format=json',
            create: '/accessmanager.svc/UserRoles?$format=json',
            update: '/accessmanager.svc/UserRoles?$format=json',
            destroy: '/accessmanager.svc/UserRoles?$format=json'
        },

        updateApiUrlWithUserId: function (userId) {
            this.api.read = this.api.read.replace('{userid}', userId);
        }

    }
});

Метод, который на основе выбранных флажков обновляет хранилище UserRole

    var chekboxes = Ext.ComponentQuery.query('userdetails #roleslist')[0];

    var selectedUserId = this.selectedUserId;
    var selectedUserRoleStore = this.selectedUserRoleStore;
    Ext.each(chekboxes.items.items, function (cb) {
        var exists = false;            
        Ext.each(selectedUserRoleStore.data.items, function (cs) {
            if (cs.data.RoleId === cb.inputValue) {
                exists = true;                    
            }                
        });
        if (cb.getValue() && !exists) {
            var newRole = Ext.create('UserRole', { RoleId: cb.inputValue, UserId: selectedUserId });
            selectedUserRoleStore.add(newRole);

        } else if (exists && !cb.getValue()) {
            // delete existing role
            var record = selectedUserRoleStore.findRecord("RoleId", cb.inputValue);
            selectedUserRoleStore.remove(record);                
        }
    });
    selectedUserRoleStore.sync();

Ответы [ 2 ]

5 голосов
/ 15 марта 2012

Предположительно, ваше поле Id назначается на стороне сервера при создании записи.Правильный?Сначала попробуйте указать idProperty: 'Id' в модели.Значение по умолчанию для этого 'id', но я думаю, что они чувствительны к регистру.

При использовании idProperty ExtJs распознает записи как «грязные» и требующие обновления на стороне сервера.

3 голосов
/ 15 марта 2012

Проблема в том, что ваш прокси должен быть специализированным типом REST:

proxy: {
        type: 'rest',

http://docs.sencha.com/ext-js/4-0/#!/api/Ext.data.proxy.Rest

Кроме того, вы, вероятно, сможете использовать метод buildURL для замены собственного метода updateAPI ....

...