Est-il possible de lier plusieurs gestionnaires d'événements aux événements JqGrid sans écraser les précédents?

Par exemple, j'appelle mes paramètres par défaut sur chaque chargement de page et lie une fonction à loadComplete pour faire un formatage de base pour mes grilles.

Sur certaines pages, j'ai une logique supplémentaire que je souhaite exécuter en même temps, mais si je configure LoadComplete dans la définition de la grille, elle remplacera la fonction définie dans mes paramètres par défaut.

Existe-t-il un moyen de lier plusieurs gestionnaires ou d'autres moyens d'exécuter tout le code nécessaire? Merci d'avance.

Je pense que vous posez des questions sur un problème important existant dans la version actuelle de jqGrid. Il est difficile de mettre en œuvre plus en tant que gestionnaire d'événements dans jqGrid maintenant. Le problème n'est pas important pour les petits projets où vous utilisez jqGrid, mais peut être important dans le cas où vous voulez construire certaines classes qui interprètent jqGrid. Votre solution actuelle est correcte, mais ayez la restriction que vous vous comprenez. Le principal problème que vous ne pouvez implémenter que plus d'un gestionnaire loadCompleteEx supplémentaire.

Ce que je vous suggère, c'est l'utilisation de jQuery.trigger ou plus jQuery.triggerHandler . Vous pouvez l'utiliser avec jQuery.bind et jQuery.unbind . Dans la façon dont vous pouvez définir n'importe quel nombre de gestionnaires d'événements qui fonctionnent comme des événements jQuery standard.

Par exemple,

 var grid = $("#list"); grid.bind('jqGridLoadComplete',function(e,data) { alert ("in first jqGridLoadComplete event handler. Called for the page " + data.page); }); grid.jqGrid({ // jqGrid parameters // ... loadComplete: function(data) { alert("main load complete"); $(this).triggerHandler("jqGridLoadComplete", data); } }); grid.bind('jqGridLoadComplete.jqGrid',function(e,data) { alert ("in second jqGridLoadComplete event handler. Called for the page " + data.page); }); 

Dans le deuxième jQuery.bind j'ai utilisé l'événement namespaced 'jqGridLoadComplete.jqGrid' à partir de l'espace de noms 'jqGrid'. Vous pouvez donc utiliser tout ce que vous connaissez (et dont vous avez besoin) des événements standard dans jQuery.

Voir ici la démo correspondante. Essayez de basculer les pages dans la grille ou modifiez le tri pour appeler loadComplete .

Je lier le second jqGridLoadComplete après la définition de jqGrid. Parce que ma démo utilise le datatype:'local' le premier appel de loadComplete sera avant la liaison exécutée. Ainsi, lors de la première exécution loadComplete , le deuxième jqGridLoadComplete événements jqGridLoadComplete ne sera pas appelé. Vous devriez donc mieux lier votre gestionnaire d'événements avant la définition de jqGrid. Dans le cas où vous pouvez être sûr que l'événement sera toujours appelé.

MISE À JOUR: IMPORTANT !!! . Il n'est pas nécessaire de déclencher explicitement l'événement jqGridLoadComplete l' intérieur de loadComplete si vous utilisez la version actuelle de jqGrid. JqGrid fait cela déjà pour toi . Le code ci-dessus a été écrit avant que la fonctionnalité correspondante soit incluse dans le code principal de jqGrid. La réponse vient de décrire l'idée principale de la façon dont plusieurs gestionnaires d'événements pourraient être implémentés dans jqGrid. Après avoir écrit la réponse, j'ai posté quelques demandes de tirage à trirand avec ma suggestion pour mettre en œuvre les événements jQuery dans jqGrid. À partir de la version 4.3.2 (voir ici ) jqGrid prend en charge les événements.

Si vous souhaitez faire quelque chose avant la demande, utilisez la fonction beforeRequest.

Vous pouvez également lier une fonction à l'option gridComplete. Pourriez-vous donner un exemple de code pour montrer ce que vous essayez de faire?

Ma solution hackaround:

 // Global Variable in my common.js var loadCompleteEx; // set defaults $.extend($.jgrid.defaults, { datatype: 'json', height: "100%", ... loadComplete: function () { if ($("#grid").getGridParam("reccount") === 0) $("#empty-grid-message").show(); else $("#empty-grid-message").hide(); // if loadCompleteEx is defined, call it at the end of loadComplete if (loadCompleteEx) loadCompleteEx(); } } // In my specific page js loadCompleteEx = function () { // Do more stuff after load completes }; 

Fonctionne comme un charme … y at-il de la mauvaise pratique ici?

Il y a une solution beaucoup plus facile à ce que j'ai vu recommander ailleurs:

 // Set defaults jQuery.extend(jQuery.jgrid.defaults, { loadComplete: function () { myCustomFunction(); } }); loadComplete: function() { // someOtherFunction(); $.jgrid.defaults.loadComplete(); // Runs myCustomFunction() },