2010-11-01 23 views
7

Folks,EXTJS Stocker le problème avec des valeurs nulles - useNull: n'a pas d'effet --Help?

J'ai un composant combobox soutenu par un JSONStore. Les données chargées dans le magasin retournent null pour la valeur de la zone de liste déroulante. La valeur est un int. Le processus de décodage JSON convertit la valeur null en un zéro; provoquant l'échec du rendu de la liste déroulante lorsqu'il tente de trouver le pk, zéro qui n'existe pas dans son magasin de sauvegarde.

J'ai trouvé l'option useNull: config pour les objets data.Field, mise à niveau vers la version 3.3.0 Final et j'ai défini ma valeur int pour la liste déroulante à utiliser Null: true. Cela n'a aucun effet, malheureusement. La valeur décodée est toujours en train de passer de null à zéro.

Des idées sur la façon de ne pas définir le champ à un zéro lorsque les données pour un champ JSON est null?

Voici une photo de ce qui se passe. Remarquez les données: la valeur est zéro, mais la valeur JSON est nulle.

Merci!

(! Gah réputation stoopid < 10 donc je ne peux pas poster directement la photo Voir ici. debug pic)

Aussi, voici la configuration sur le terrain de mon magasin:

fields: [ 
     {name:"id", type:"int"}, 
     {name:"occurenceDate", dateFormat: 'Y-m-d\\TH:i:s', type:"date"}, 
     {name:"docketNumber", type:"string"}, 
     {name:"courtLocationId", type:"int", useNull:true}, 
     {name:"assignedOfficerId", type:"int", useNull:true}, 
     {name:"primaryIncidentTypeId", type:"int", useNull:true}, 
     {name:"secondaryIncidentTypeId", type:"int", useNull:true}, 
     {name:"tertiaryIncidentTypeId", type:"int", useNull:true}, 
     {name:"incidentLocation", type:"string"}, 
     {name:"summary", type:"string"}, 
     {name:"personalItemsSeized", type:"string"}, 
     "supplements", 
     "parties", 
     "judgeIds" 
    ] 
+0

Maintenant, je ne suis pas sûr de problèmes de rendu de la combobox sont en raison des valeurs un-mappable provenant le serveur. J'ai configuré le JSONObjectMapper pour ne pas retourner les champs NULL au client comme si (en utilisant Jackson w/Spring): setSerializationConfig(). SetSerializationInclusion (JsonSerialize.Inclusion.NON_NULL); maintenant les champs null ne retournent pas, mais la liste déroulante échoue toujours à rendre correctement. Toujours à la recherche .... –

Répondre

3

Essayez d'utiliser sans déclaration de type. Vous pouvez également utiliser la méthode de conversion:

{ 
    name: "primaryIncidentTypeId", 
    convert: function(value, row) { 
     return (value == null) ? null : parseInt(value); 
    } 
} 
+0

Merci pour le conseil. J'ai ajouté avec succès ci-dessus (seule différence: Ext.isEmpty (valeur) - la valeur est une chaîne vide et! = Null). Cela a résolu le problème de JSON traduire une valeur nulle à un zéro, mais il n'a pas résolu le problème où mes boîtes à liste déroulante réduisaient. J'ai découvert que vous devez définir explicitement la largeur: config pour une combobox, sinon les combos vont se rétrécir. –

+0

Une autre note: J'ai rencontré deux problèmes au cours de ce processus.Le 1er est que la fonction convert: définie dans les champs: param du magasin n'a jamais été appelée. La raison en est que je retournais les méta-données de la colonne du serveur dans le get qui peuplait le magasin; écraser ce que j'avais codé en dur dans la configuration javascript côté client. –

+0

Le deuxième problème était avec Extjs 3.3.0. la version finale a ce que je pense être un bogue en demandant à un BasicForm à updateRecord() sur un formulaire dont les champs sont null. Le problème est dans les entrailles de updateRecord() de BasicForm: il parcourt ses champs en appelant getValue(), mais appelle ensuite value.groups - ou quelque chose comme ça. Si la valeur est nulle, ce n'est pas un objet et ... KABOOM. Des idées sur celui-ci? J'aimerais passer à la version 3.3, donc je peux utiliser la propriété useNull: à la place des convertisseurs. –

0

A propos de la largeur de combo: J'utilise habituellement

defaults: { 
    anchor: '100%' 
} 

dans la déclaration de formulaire et aucun problème avec des largeurs.

Est-il possible de fournir des fonctions de conversion du côté serveur avec toutes les autres métadonnées?

Et j'utilise encore ExtJS 3.2 - pas besoin de tous les nouveaux bugs dans les systèmes de production :)

+0

Oui, vous pouvez fournir les fonctions de conversion dans les métadonnées du côté serveur, désolé de ne pas le signaler. Nous utilisons du code côté serveur pour générer des métadonnées de magasin extjs basées sur n'importe quel bean java. Notre processus n'est pas encore assez sophistiqué pour inclure des convertisseurs dans le code généré. –

+0

merci pour le conseil re 'anchor: '100%'' Je l'ai utilisé, mais ma forme est trop large pour qu'elle soit attrayante. Je vais devoir trouver quelque chose comme mettre des colonnes dans le formulaire pour gérer la taille. jusqu'à ce que je de-paresseux-je-fy moi-même, je vais coller avec la largeur:. :-) –

0

Cela m'a aussi, vous pouvez en outre remplacer la fonction de conversion de type en Ext.data.Types pour permettre Valeurs nulles pour les champs de type entier.

Ext.data.Types.INT.convert = function(v){ 
    v = parseInt(String(v).replace(Ext.data.Types.stripRe, ''), 10); 
    return isNaN(v) ? null : v; 
}; 
-1

Vous devez utiliser defaultValue: null ,useNull : true parce que la valeur par défaut pour le type de integet est égal à zéro

Exemple:

{name:"primaryIncidentTypeId", type:"int", useNull:true , defaultValue: null },