2011-11-02 4 views
6

J'ai un magasin ExtJS avec un lecteur proxy ajax et JSON:Lire l'article ExtJS de paiement ajax magasin

Ext.create('Ext.data.Store', { 
    proxy: { 
     type: 'ajax', 
     url: '...', 
     reader: { 
      type: 'json', 
      root: 'data', 
      totalProperty: 'totalCount', 
      messageProperty: 'message', 
      successProperty: 'success' 
     }, 
    ... 

Voici ce que je reçois du serveur:

data: [...] 
message: "I want to read this string after the store is loaded" 
success: true 
totalCount: x 

Maintenant, je veux accéder à le 'message' quand le magasin est chargé - où puis-je l'obtenir? Je regardais beaucoup mais je ne trouve pas de place pour accrocher? Le seul écouteur dans le proxy est l'exception, cela ne m'aide pas vraiment.

Répondre

5

utilisation magasin d'événements load:

Ext.create('Ext.data.Store', { 
    listeners: { 
    'load': function(store, records, successful, operation) { 
     alert(operation.resultSet.message); 
    } 
    }, 
    proxy: { 
    // ... 

MISE À JOUR

Il semble que la documentation pour l'événement de charge est erroné. La liste d'arguments correcte est (store, records, successful) (aucun argument d'opération). Par conséquent, la solution ci-dessus ne fonctionnerait pas.

Cependant, il est la propriété de lecteur rawData qui peut aider:

Ext.create('Ext.data.Store', { 
    listeners: { 
    'load': function(store, records, successful) { 
     alert(store.getProxy().getReader().rawData.message); 
    } 
    }, 
    proxy: { 
    // ... 
+0

Merci, j'ai essayé la charge des auditeurs bien sûr, mais je ne l'ai pas la 'resultSet' en opération. Mais de toute façon l'objet d'opération contient juste les méthodes d'écouteur de magasin (j'ai beforeload et charge) et quand j'essaye d'accéder à resultSet il est indéfini. J'utilise ExtJS 4.0.2a. Une idée? Votre solution serait parfaite - si cela fonctionnerait dans mon projet :) Quelle version d'ExtJS utilisez-vous? – Marc

+0

@Marc, bizarrement, mais il semble que l'argument d'opération n'est pas passé dans le gestionnaire d'événements de chargement (mais les docs disent qu'il devrait être passé). Cependant j'ai trouvé une autre solution. Mise à jour ma réponse –

+0

Parfait, merci beaucoup, c'était tout! – Marc

0

Ma réponse s'applique à ExtJs 4.1.x. J'ai passé du temps à lire le code et il semble que l'une des façons de le faire est de fournir un rappel dans l'événement beforeload du magasin au lieu de gérer l'événement load. Le callback est passé à l'objet d'opération qui contiendra les paramètres de requête d'origine et en cas de succès il contiendra l'objet de réponse et les données (analysées) sous la propriété resultSet.

0

Dans d'autres cas:

myStore.load({ 
    callback : function(object, response, success) { 
    // on error response: success = false 
    if(!success) { 
     // i don't remember de correct path to get "message" or "responseText" 
     console.log(response.response.responseText); 
    } else { 
     ... 
    } 
}); 

Cya!

0

je reçois le message de la manière suivante, bien que je charge manuellement et ne pas utiliser les événements ici: sais

var initData = Ext.create('My.data.SomeAjaxStore'); 

initData.load(function(records, operation, success) { 
    if (!success || operation.hasException()) { 
    // Here is your message from server 
    // In case of HTTP error you get: 
    // { 
    // status: 404, 
    // statusText: "Not Found" 
    // } 
    var error = operation.getError(); 
    Ext.log({msg:[Ext.getClassName(me), ": Command failure: ", error].join(""), level:"error"}); 
}