2011-09-26 2 views
1

version plug-in Calendrier: RELEASE COURANT 1.2.1Grails plugin calendrier lance pile/récursion erreur

Je suivais pas comme mentionné dans le plugin Grails documentation, je reçois l'erreur suivante dans tous les types de navigateur

Chrome 14.0835: Uncaught RangeError: taille maximale de la pile d'appels dépassée.

Firefox 6.02: Trop récursion calendar.js ligne 1851

IE 9: Sur calendar.js espace pile ligne 1850

Répondre

4

L'infraction code jscalendar est la suivante:

Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear; 
Date.prototype.setFullYear = function(y) { 
    var d = new Date(this); 
    d.__msh_oldSetFullYear(y); 
    if (d.getMonth() != this.getMonth()) 
     this.setDate(28); 
    this.__msh_oldSetFullYear(y); 
}; 

qui redéfinit Date.setFullYear(). Jetez un oeil aux commentaires # 124 et # 125 sur ce "old jscalendar" page.

Commentaire # 124 (par Chris Vif)

suggère la mise à jour calendar.js (près du fond, ~ ligne 1850).

For those getting the recursion error. You just need to comment a few lines. See below.

//Date.prototype.msh_oldSetFullYear = Date.prototype.setFullYear; 
Date.prototype.setFullYear = function(y) { 
    var d = new Date(this); 
    //d.msh_oldSetFullYear(y); 
    if (d.getMonth() != this.getMonth()) 
     this.setDate(28); 
    //this._msholdSetFullYear(y); 
}; 

Commentaire # 125 (réponse Larisa)

The problem with recursion occurs due to multiple includes of calendar JavaScript on a page. As a result Date patch redefines setFullYear function twice and causes infinite loop when it gets executed. We fixed it by making sure that function is redefined only once:

if(Date.prototype.msh_oldSetFullYear == null) { 
    Date.prototype.msh_oldSetFullYear = Date.prototype.setFullYear; 
} 

Ces deux suggèrent mises à jour de calendar.js, ce qui est pas idéal car il est livré avec le plug-in.

Deux suggestions:

  • Assurez-vous que vous n'êtes pas importer les ressources civiles à deux reprises. Avez-vous un <calendar:resources/> dans votre agencement principal et votre vue GSP? Si oui, retirez l'un d'entre eux.
  • Si cela ne fonctionne pas, utilisez peut-être un plugin différent. Le plugin de calendrier semble n'avoir pas été mis à jour depuis longtemps (il utilise une ancienne version de jscalendar). Si vous vous sentez ambitieux, vous pouvez mettre à jour le plugin vous-même!
+0

Merci beaucoup de me pointer au bon endroit. Comme vous l'avez dit, j'ai fait des changements directement dans le calendar.js dans le plugin et testé. Cela fonctionne bien. Mais puisque vous avez également souligné que ce n'est pas idéal pour toucher les fichiers plugin, je dois chercher un moyen approprié de le changer. – srisris

0

La façon dont je résolu ce problème est

1) Téléchargé la source du plugin 2) Création d'un plug-in avec le même nom localement. 3) copia les fichiers source d'origine au plugin locale que j'ai créé 4) a modifié le fichier javascript comme suggéré ci-dessus 5) Compile et empaqueter le plugin 6) Suppression de l'ancien plugin dans mon projet principal 7) installé le nouveau plugin à partir du fichier zip créé à partir de l'étape 5.

Cela a fonctionné comme un charme.

Merci Rob Hruska me montrant où des commentaires dans le fichier javascript

1

Cela fonctionne pour moi:

if (Date.prototype.__msh_oldSetFullYear == null) { 
    Date.prototype.__msh_oldSetFullYear = Date.prototype.setFullYear; 
} 
Date.prototype.setFullYear = function(y) { 
    var d = new Date(this); 
    Date.prototype.__msh_oldSetFullYear.apply(d, arguments); 
    if (d.getMonth() != this.getMonth()) 
     this.setDate(28); 
    Date.prototype.__msh_oldSetFullYear.apply(this, arguments); 
}; 
0

je faisais face même problème, je l'avais placé <calendar:resources/> dans ma principale jsp ainsi que dans le modèle qui a été rendu dans le jsp. Enlever l'un d'entre eux a résolu le problème.