2009-05-26 3 views
0

Le gestionnaire d'un bouton extjsAction appelle une fonction avec le code suivant.extjsGirdPanel.getView(). GetRowClass ne fonctionne pas 2ème fois

Add: function() { 
     var window = Ext.getCmp('wndAdd'); 
     window.items.items[0].getStore().reload; 
     var Grid1 = Ext.getCmp('grdAll'); 

     var grdStore2 = Ext.getCmp('grid2').getStore(); 
     var i = 0; 
     var IDList = new Array(); 
     for (i = 0; i < grdStore2.data.length; i++) { 

       IDList[i] = 
       grdStore2.data.items[i].data['ID']; 

     } 

     Grid1.getView().getRowClass = function(record, index) { 

      if (IDList.contains(record.data["ID"])) { 
       return 'disabled-row'; 
      } 
     }; 

     window.show(); 

    } 

Mais la fonction getRowClass ne fonctionne que sur le premier bouton clic. Ne pas désactiver la ligne qui est ajoutée.

+0

Quand est-ce que vous tirez getRowClass? Il semble que vous créez la fonction mais que vous n'appelez jamais à une réponse. – Ballsacian1

Répondre

1

Oui, getRowClass est appelée une seule fois lorsque la grille est configurée. Mais je voulais quelque chose qui allumerait everytimewindow.show() serait viré. J'ai utilisé le code ci-dessous sur l'événement window.onshow.

for (var i = 0; i < Grid1.getStore().data.length; i++) { 
    var element = Ext.get(Grid1.getView().getRow(i)); 
    var record = Grid1.getStore().getAt(i); 
    if (IdList.contains(record.data.ID)) { 
     element.addClass('disabled-row') 
    } else { 
     element.removeClass('disabled-row') 
    } 
} 
0

Je vais modifier ma réponse avec une réponse appropriée une fois fourni plus d'informations.

Quand est-ce que vous tirez getRowClass? Il semble que vous créez la fonction mais que vous n'appelez jamais à une réponse.

Est-ce que la fonction expire, est appelée ou ne fait pas ce que vous voulez?

2

getRowClass ne doit être affecté qu'une seule fois. Ce n'est pas une fonction que vous appelez, c'est une fonction appelée en interne par la grille chaque fois qu'une ligne est rendue. Plutôt que de l'affecter à une fonction de gestion d'événement, elle doit être affectée une fois, quelque part au niveau de l'application (par exemple, partout où Grid1 est configuré pour la première fois, il s'agit de l'emplacement le plus logique). Cela peut ou non être votre problème, selon la façon dont votre fonction d'ajout est appelée, ce qui n'est pas clair. Gardez à l'esprit que puisque vous comptez sur IDList dans getRowClass, vous devrez également avoir une référence à cette variable qui est dans la portée où la fonction est, et vous devrez probablement également ajouter des vérifications pour vous assurer qu'il est valide avant d'accéder il.

Vous n'indiquez pas non plus où Grid1 est rendu. Comme expliqué ci-dessus, getRowClass ne s'exécute que lorsque les lignes sont affichées, donc à moins que vous n'actualisiez Grid1 quelque part qui ne figure pas dans votre code, getRowClass ne sera jamais appelé.

+0

Ceci est vrai. getRowClass n'est exécuté que lors du (re) rendu. Je pense que le rechargement du magasin (appelé au début de la fonction) devrait faire l'actualisation de la grille, mais seulement dans le cas où les données ont changé (les ajouts internes ne comptent pas). On ne sait pas non plus si 'window.items.items [0] .getStore()' et 'Ext.getCmp ('grid2'). GetStore()' retourne le même magasin. – Thevs

+0

Oui, getRowClass était appelé une seule fois lors de la configuration de la grille. Et j'avais besoin de quelque chose qui se déclencherait chaque fois que l'événement window.show se déclencherait.J'ai donc utilisé le code ci-dessous dans onWindowShow pour (var i = 0; i user99322

1

Pour votre information, alors que je suis heureux que vous avez trouvé une solution qui fonctionne pour vous, je ne suis pas sûr que vous comprenez getRowClass encore. Il n'est pas appelé une seule fois - il est appelé chaque fois qu'une ligne de la grille est rendue à nouveau (ce qui est des changements de données à tout moment). Il était seulement appelé une fois dans votre code parce que votre code n'était pas configuré correctement.

Je ne comprends pas parfaitement votre cas d'utilisation, mais quelle que soit la fenêtre affichée, l'entrelacement des lignes ne doit être modifié que si les données sous-jacentes de la grille ont réellement changé. Lorsque vous configurez la fonction getRowClass correctement, la grille prend soin de l'appeler automatiquement pour vous, quand il le faut, et cela devrait "fonctionner". Il ne devrait pas être nécessaire pour votre code d'itération comme écrit qui ajoute juste des frais supplémentaires.

Encore une fois, juste FYI. :)

+0

Eh bien, la ligne le striping sur Grid1 dépendait en fait du changement de données dans une autre grille. Dans mon cas, Idlist est celui qui change et en fonction de cela la classe de ligne dans ma grille1 change. – user99322

+1

Je pense toujours que vous lieriez simplement Grid1 à n'importe quel magasin sous-jacent gère les données, même si elle est modifiée dans une autre grille. De cette façon, les mises à jour et les appels à getRowClass sont faits pour vous comme prévu sans avoir besoin d'un traitement manuel. Mais encore une fois, si vous avez une solution qui fonctionne pour vous, c'est ce qui compte le plus. –