2017-04-07 2 views
6

Remarques

Version ExtJS: 6.2.1.167ExtJS 6: Question à l'aide de plusieurs éditeurs en une seule colonne de la grille

Fiddle: fiddle.sencha.com/#view/editor & violon/1tlt

Cette fonctionnalité a fonctionné dans ExtJS 2.x et n'a rencontré aucun problème.


Objectif

Pour avoir une grille (avec un plugin fonctionnalité et l'édition des cellules de regroupement) qui peut avoir plusieurs éditeurs différents (textfield et combo s) dans une seule colonne.

La grille a inversé le système de table traditionnel afin que les noms de champ et les valeurs d'enregistrement soient affichés verticalement. Un exemple de l'en-tête de table est montrée ici:

+-------------+-----------------+-----------------+----------------- 
- Field Names - Record 1 Values - Record 2 Values - Editable Column 
+-------------+-----------------+-----------------+----------------- 

Nous ne pouvons pas utiliser le système traditionnel, car il y a des centaines de champs, mais seulement plusieurs enregistrements à comparer.


code

Here is the fiddle

Voici le code principal qui me permet d'utiliser plusieurs éditeurs:

Ext.define('MemberCellEditing', { 
 

 
    extend: 'Ext.grid.plugin.CellEditing', 
 
    xtype: 'membercellediting', 
 
    alias: 'plugin.membercellediting', 
 

 
    getCachedEditor: function(editorId, record, column) { 
 
    var me = this, 
 
     editors = me.editors, 
 
     dropDownName = record.get('dropDown'); 
 

 
    // If dropdown field, use dropdown name as editor id 
 
    if (dropDownName && dropDownName != 'N') editorId = dropDownName; 
 

 
    // Attempt to get editor 
 
    var editor = editors.getByKey(editorId); 
 

 
    if (!editor) { 
 

 
     if (dropDownName && dropDownName != 'N') { 
 
     // Retrieve combo 
 
     var combo = DropDownManager.getCombo(editorId); 
 

 
     // Create editor with combo 
 
     editor = Ext.create('Ext.grid.CellEditor', { 
 
      editorId: editorId, // Each dropdown field will have its own combo 
 
      field: combo, 
 
      floating: true 
 
     }); 
 
     } else { 
 
     // Use default editor configured for column 
 
     editor = column.getEditor(record); 
 
     } 
 

 
     if (!editor) { 
 
     return false; 
 
     } 
 

 
     // Allow them to specify a CellEditor in the Column 
 
     if (!(editor instanceof Ext.grid.CellEditor)) { 
 
     // Apply the field's editorCfg to the CellEditor config. 
 
     // See Editor#createColumnField. A Column's editor config may 
 
     // be used to specify the CellEditor config if it contains a field property. 
 
     editor = new Ext.grid.CellEditor(Ext.apply({ 
 
      floating: true, 
 
      editorId: editorId, 
 
      field: editor 
 
     }, editor.editorCfg)); 
 
     } 
 

 
     // Add the Editor as a floating child of the grid 
 
     // Prevent this field from being included in an Ext.form.Basic 
 
     // collection, if the grid happens to be used inside a form 
 
     editor.field.excludeForm = true; 
 

 
     // If the editor is new to this grid, then add it to the grid, and ensure it tells us about its life cycle. 
 
     if (editor.column !== column) { 
 
     editor.column = column; 
 
     column.on('removed', me.onColumnRemoved, me); 
 
     } 
 
     editors.add(editor); 
 
    } 
 

 
    // Inject an upward link to its owning grid even though it is not an added child. 
 
    editor.ownerCmp = me.grid.ownerGrid; 
 

 
    if (column.isTreeColumn) { 
 
     editor.isForTree = column.isTreeColumn; 
 
     editor.addCls(Ext.baseCSSPrefix + 'tree-cell-editor'); 
 
    } 
 

 
    // Set the owning grid. 
 
    // This needs to be kept up to date because in a Lockable assembly, an editor 
 
    // needs to swap sides if the column is moved across. 
 
    editor.setGrid(me.grid); 
 

 
    // Keep upward pointer correct for each use - editors are shared between locking sides 
 
    editor.editingPlugin = me; 
 
    return editor; 
 
    } 
 
});


Problème

Alors que mon code actuel vous permettra d'utiliser avec succès plusieurs éditeurs dans une seule colonne, il « au hasard » renvoie des erreurs. Je dis au hasard parce que je n'ai pas été en mesure de traquer la cause réelle des erreurs.

Erreur # 1 Impossible d'obtenir la propriété style de référence non définie ou null

screenshot

enter image description here

Erreur # 2 Impossible d'obtenir la propriété parentNode de référence non définie ou null

screenshot

enter image description here

La cause de ces deux erreurs est parce que la propriété el sur l'éditeur, il fait référence à l'heure actuelle a été détruite, ce qui signifie qu'il n'y a pas la propriété dom.


Comment Reproduire

Cela fait partie de la raison pour laquelle je ne l'ai pas été en mesure de résoudre ce problème. Je n'ai pas réussi à trouver une méthode concrète pour reproduire le problème. Malheureusement, la façon dont je peux obtenir les erreurs est une combinaison aléatoire de cliquer/tabulation dans les cellules, entrer des données, passer à d'autres cellules, groupes de commutation, etc ... Ma méthode actuelle qui fonctionne habituellement consiste à entrer des données aléatoires et cliquer furieusement pour alterner le focus entre deux cellules voisines. La plupart du temps, il faut moins de 30 secondes pour obtenir une erreur.

Ma théorie actuelle est qu'il y a un événement qui est déclenché qui appelle une fonction qui, pour une raison quelconque, détruit la propriété el de l'éditeur. J'ai essayé d'examiner la valeur en haut des piles d'appels de l'erreur et il semble que la propriété el est déjà détruite à ce moment-là.


Bottom Line

Je cherche des suggestions sur la façon de traquer la cause réelle du problème.


Mise à jour

Il se trouve que cela, il y a un bug tournant autour de l'utilisation des combos dans les éditeurs de cellules au moment. Voici une autre personne avec un problème similaire:

https://www.sencha.com/forum/showthread.php?330959-ExtJs-6-2-CellEditing-plugin-editor-el-dom-is-null

Voici id bug: ExtJS-23330

Selon Sencha de soutien, il n'y a actuellement aucune solution disponible et le bug est toujours ouvert.


Mise à jour # 2

Ce bogue existe dans 6.0.2 et 6.5.

Heureusement, je l'ai trouvé un moyen de reproduire de manière plus cohérente le bug:

  1. Survoler groupe A pendant 5 secondes. Développez le groupe A.
  2. Passez la souris sur (champ 1, colonne de valeur) pendant 5 secondes.
  3. Cliquez sur (champ 1, colonne de valeur).
  4. Attendez 5 secondes, puis réduisez le groupe A.
  5. Attendez 3 secondes, puis passez la souris sur l'en-tête du groupe B.
  6. Attendez 10 secondes, puis passez la souris sur l'en-tête du groupe A.
  7. Attendez 3 secondes, puis développez le groupe A.
  8. Survolez le champ (champ 1, colonne de valeur) pendant 3 secondes. Passez la souris sur (champ 1, colonne 2) pendant 3 secondes.
  9. Cliquez sur (champ 1, colonne 2).

Si l'erreur ne se produit pas (semble pas se produire encore à 6,5):

  1. Attendez 3 secondes, puis cliquez sur (champ 1, colonne Valeur).
  2. Attendez 1 seconde, puis cliquez à nouveau sur (Champ 1, Colonne Valeur).

Ce n'est pas 100%, mais c'est beaucoup plus fiable qu'un clic aléatoire.

Répondre

0

Il est difficile de dire sans un peu plus de contexte dans le code et la pile des appels, mais si l'erreur 2 ci-dessus est toujours un bon exemple des problèmes à résoudre, vous devriez pouvoir modifier le! Editor.rendered pour lire else if (!editor.destroyed), juste au-dessus du point d'arrêt dans la capture d'écran.