2010-12-08 39 views
3

J'ai créé un composant grille avec la configuration du magasin comme celui-ci:Extjs Restful Store, Envoi de la demande par lots?

//Create the store 
    config.store = new Ext.data.Store({ 
     restful: true, 
     autoSave: false, 
     batch: true, 
     writer: new Ext.data.JsonWriter({ 
      encode: false 
     }), 
     reader: new Ext.data.JsonReader({ 
      totalProperty: 'total', 
      root: 'data', 
      fields: cfg.fields 
     }), 
     proxy: new Ext.data.HttpProxy({ 
      url:cfg.rest, 
      listeners:{ 
       exception: { 
        fn: function(proxy, type, action, options, response, arg) { 
         this.fireEvent('exception', proxy, type, action, options, response, arg); 
        }, 
        scope: this 
       } 
      } 
     }), 
     remoteSort: true, 
     successProperty: 'success', 
     baseParams: { 
      start: 0, 
      limit: cfg.pageSize || 15 
     }, 
     autoLoad: true, 
     listeners: { 
      load: { 
       fn: function() { 
        this.el.unmask(); 
       }, 
       scope: this 
      }, 

      beforeload: { 
       fn: function() { 
        this.el.mask("Working"); 
       }, 
       scope: this 
      }, 
      save: { 
       fn: function(store, batch, data) { 
        this.el.unmask(); 
        this.fireEvent('save', store, batch, data); 
       }, 
       scope: this 
      }, 

      beforewrite: { 
       fn: function(){ 
        this.el.mask("Working..."); 
       }, 
       scope: this 
      } 

     } 
    }); 

Note: Ignorer les fireEvents. Ce magasin est en cours de configuration dans un composant de grille personnalisé partagé.

Cependant, j'ai un problème ici: Quelles que soient les actions de CRUD que j'ai faites, je sors toujours avec N demandes au serveur qui est égal à N lignes que j'ai sélectionnées. c'est-à-dire que si je sélectionne 10 lignes et que je clique sur Supprimer, 10 requêtes SUPPRIMER seront effectuées sur le serveur.

Par exemple, voici comment supprimer des enregistrements:

/** 
* Call this to delete selected items. No confirmation needed 
*/ 
_deleteSelectedItems: function() { 
    var selections = this.getSelectionModel().getSelections(); 
    if (selections.length > 0) { 
     this.store.remove(selections); 
    } 
    this.store.save(); 
    this.store.reload(); 
}, 

Note: La portée de « ce » est un composant Grille.

Alors, est-ce supposé être comme ça? Ou mon problème de configuration? J'utilise Extjs 3.3.1, et selon la documentation de batch sous Ext.data.Store,

Si Store est RESTful, le DataProxy est également RESTful, et une transaction unique est généré pour chaque enregistrement .

Je souhaite que ce soit mon problème de configuration.

Note: J'ai essayé avec listful, encode, writeAllFields, encodeDelete dans Ext.data.JsonWriter ... sans espoir

Répondre

2

Vous lisez la documentation correctement; c'est censé fonctionner de cette façon. C'est quelque chose à considérer lorsque vous choisissez d'utiliser les magasins RESTful sur vos grilles. Si vous avez besoin d'opérations par lots, les magasins RESTful ne sont pas vos amis. Pardon.

+0

Hey wes, merci beaucoup pour votre réponse. Je pensais que c'est l'une des erreurs de configuration que j'ai commises qui soulève ce problème, au moins vous l'avez confirmé avec moi. –

+0

Je me demande si cela reste vrai dans ExtJS 4.1.3? – justinzane

+0

@justinzane - Je ne sais pas sur ExtJS 4. Cette question concerne spécifiquement ExtJS 3. Il vaut sans doute sa propre question de poser des questions sur les demandes par lots reposant v4. – wes

6

Juste pour ceux qui pourraient se demander pourquoi ce n'est pas lot:

En ce qui concerne la documentation indiquée,

Si Store est RESTful, le DataProxy est également RESTful, et a généré une transaction unique pour chaque record.

Ce qui est vrai si vous regardez dans le code source de Ext.data.Store dans /src/data/Store.js

ligne 309, dans @constructor

// If Store is RESTful, so too is the DataProxy 
if (this.restful === true && this.proxy) { 
    // When operating RESTfully, a unique transaction is generated for each record. 
    // TODO might want to allow implemention of faux REST where batch is possible using RESTful routes only. 
    this.batch = false; 
    Ext.data.Api.restify(this.proxy); 
} 

Et voici alors pourquoi je me rends compte lorsque j'utilise restful, mon batch ne sera jamais changé en true.

+1

Excellente réponse! Fscking complètement ennuyeux, de mon POV, mais ce n'est pas de ta faute.Je suis un peu curieux de savoir pourquoi Sencha pense que le repos nécessite un xmlhttprequest par transaction RESTful, cependant. Le traitement par lot ne semble pas modifier la prémisse de l'appariement d'états. – justinzane

+0

Wow merci. Mais c'est un peu vieux (2010)! Est-ce encore applicable à la v4.1 existante? Lolx! –