2012-03-15 9 views
0

ユーザーとユーザーの役割を管理する単純なExtJsアプリケーションを作成しようとしています。一連のRESTサービスはバックエンドでこの機能を提供します。 ユーザーに新しい役割を割り当てると、適切なデータストアがPOST(作成)要求をサービスに送信します。しかし、ユーザーから既存のロールを削除すると、DELETE要求をサービスに送信せずにローカルストアからのみ削除されます。ここ は私のコードです:ExtJSストア/プロキシがサーバーに削除メソッドを送信しない

モデル:プロキシと

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(); 
+0

Ext JS 5または6を使用している場合は、プロキシがサーバーに要求を送信するために、 'destroy'メソッドの代わりに' erase'メソッドを呼び出す必要があることに注意してください。これはバージョン5以降に変更されました。 –

答えて

5

おそらくあなたイドを更新しますフィールドは、レコードが作成されるときにサーバー側で割り当てられます。正しい?まず、モデルにidProperty: 'Id'を指定します。これのデフォルト値は 'id'ですが、大文字と小文字が区別されると思います。

idPropertyを使用するExtJsはレコードを「ダーティ」として認識し、サーバー側で更新する必要があります。

+0

大文字小文字を区別した 'id'は難しい部分でした。 – Glaxalg

3

問題は、プロキシ、特殊なREST型である必要がある。また、

proxy: { 
     type: 'rest', 

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

、あなたはおそらく、あなた自身のupdateAPIを置き換えるためにbuildURLメソッドを使用することができるようになります...方法。

+0

'id'を 'id'に変更した後、storeがDELETEではなくPOSTを送信し、 'rest'に変更しました。 – Glaxalg

関連する問題