Плагин Grails Calendar выдает ошибку стека / рекурсии - PullRequest
1 голос
/ 26 сентября 2011

Версия плагина календаря: CURRENT RELEASE 1.2.1

Я выполнил шаги, указанные в документации к плагину Grails, я получаю следующую ошибку во всех типах браузера

Chrome 14.0835: Uncaught RangeError: Превышен максимальный размер стека вызовов.

Firefox 6.02: слишком много рекурсии calendar.js строка 1851

IE 9: нехватка стека calendar.js строка 1850

Ответы [ 4 ]

4 голосов
/ 26 сентября 2011

Код jscalendar, вызывающий проблемы, выглядит так:

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);
};

, который переопределяет Date.setFullYear().Посмотрите комментарии № 124 и № 125 на этой "старой странице jscalendar" .

Комментарий № 124 (автор Крис Лайвли)

Предлагает обновить calendar.js (в нижней части, ~ строка 1850).

Для тех, кто получает ошибку рекурсии.Вам просто нужно прокомментировать несколько строк.См. Ниже.

//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);
};

Комментарий # 125 (ответ от larisa)

Проблема с рекурсией возникает из-за многократного включения календаря JavaScriptна странице.В результате патч Date дважды переопределяет функцию setFullYear и вызывает бесконечный цикл при его выполнении.Мы исправили это, убедившись, что функция переопределена только один раз:

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

Оба из них предлагают обновления файла calendar.js, что не идеально, так как поставляется с плагином.

Два предложения:

  • Убедитесь, что вы не импортируете ресурсы календаря дважды.У вас есть <calendar:resources/> в вашем основном макете и в вашем представлении GSP?Если это так, удалите один из них.
  • Если это не сработает, возможно, используйте другой плагин.Плагин календаря выглядит так, как будто он не обновлялся некоторое время (он использует более старую версию jscalendar).Если вы чувствуете себя честолюбивым, вы можете сами обновить плагин!
1 голос
/ 04 сентября 2012

Это работает для меня:

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 голосов
/ 03 октября 2016

Я столкнулся с той же проблемой, я поместил <calendar:resources/> в мой основной jsp, а также в шаблон, который был отображен в jsp. Удаление одного из них решило проблему.

0 голосов
/ 27 сентября 2011

Я решил эту проблему следующим образом:

1) Загрузил исходный код плагина 2) Локально создал плагин с тем же именем.3) Скопируйте исходные файлы в созданный мной локальный плагин. 4) Измените файл javascript, как предложено выше. 5) Скомпилируйте и упакуйте плагин. 6) Удалите старый плагин из моего основного проекта. 7) Установите вновь созданный плагин из ZIP-файла.создан из шага 5.

Это сработало как шарм.

Спасибо Робу Хруске за то, что он указал мне, где комментировать в файле javascript

...