Калитка Странное поведение URL с ajax

#javascript #ajax #wicket #wicket-7

#javascript #ajax #калитка #калитка-7

Вопрос:

У меня проблема, которая имеет странные шаги. У меня есть поведение ajax, отображаемое на этапе рендеринга Head

     final AbstractDefaultAjaxBehavior behave = new AbstractDefaultAjaxBehavior() {
       protected void respond(final AjaxRequestTarget target) {
             boolean undoEn = getRequest().getQueryParameters().getParameterValue("undoEn").toBoolean();
             if (undoEn) {
                mSaveButton.setEnabled(true);
                target.add(mSaveButton);
             }
        }
    };

    public String getCallbackName() {
        return "saveButtonVisibilityToggle";
    }

    @Override
    public void renderHead(IHeaderResponse response) {
        String script = getCallbackName()   " = function (e) {  Wicket.Ajax.ajax({"u": ""   behave.getCallbackUrl()   "   amp;undoEn=" e "" });}";
        response.render(OnDomReadyHeaderItem.forScript(script));
    }
  

Все работает хорошо, это поведение вызывается каждый раз, когда узел изменяется в редакторе TinyMCE

      settings.addCustomSetting(" setup: function(editor) {"  
            "        editor.on('NodeChange', function(e) {"  
            " editor.save();"  
            getCallbackName()   "(editor.undoManager.hasUndo())"  
            "        });"  
            "    }");
  

Но иногда, когда я покидаю вкладку браузера, меняю несколько вкладок (chrome), затем использую другое приложение в течение нескольких минут и возвращаюсь к нашей вкладке, URL-адрес ajax случайно появляется в URL-адресе браузера.

 http://localhost:8080/wicket/bookmarkable/com.tac.kulik.pages.SomePage?3-1.IBehaviorListener.0-contentPanelamp;entityId=2   amp;undoEn=true
  

также довольно странно, что вместо передачи параметра normap добавлены знаки

кстати, этот сигнал распознается как «2», поэтому по какой-то причине ‘ ‘ заменен на пробел

ОБНОВЛЕНИЕ 1 С помощью ответа @svenmeier я обновил бесконечный цикл запуска страницы. с журналами

 org.apache.wicket.core.request.mapper.StalePageException: A request to     
page '[Page class = x.x.x.CardPage, id = 25, render count = 1]' has been
 made with stale 'renderCount'. The page will be re-rendered.
  

и действительно, по какой-то причине behave link имеет значение renderCount 1, но форма имеет 0.
запрос из браузера
jquery-1.12.4-ver-1476216952000.js: 10254 XHR завершил загрузку: ПОЛУЧИТЬ «http://localhost:8080/wicket/bookmarkable/com.tac.pages.ca…?4-0 .IBehaviorListener.0-ContentPanelamp;CardID=1amp;_=1476873175645amp;Отменить = true»

Я добавил некоторый набор JS, чтобы предотвратить циклическое обновление, но у меня все еще есть устаревшее исключение

      "if (editor.undoManager.hasUndo()) { "  
            "                  console.debug('Behave called ');"  
            behave.getCallbackScript()  
            "        }"  
  

это мое поведение

    final AbstractDefaultAjaxBehavior behave = new AbstractDefaultAjaxBehavior() {
        protected void respond(final AjaxRequestTarget target) {
            log.info("Behave called");
            boolean undoEn = getRequest().getQueryParameters().getParameterValue("undoEn").toBoolean();
            if (undoEn) {
                mSaveButton.setEnabled(true);
                target.add(mSaveButton);
            }
        }
        //
        @Override
        protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
            super.updateAjaxAttributes(attributes);
            String undoEn = "return {'undoEn': editor.undoManager.hasUndo()};";
            attributes.getDynamicExtraParameters().add(undoEn);
        }
    };
  

И нет никакой разницы, это может быть поведение без какой-либо реализации, поведение страницы такое же ((

     final AbstractDefaultAjaxBehavior behave = new AbstractDefaultAjaxBehavior() {
        @Override
        protected void respond(AjaxRequestTarget target) {

        }
    };
  

Комментарии:

1. Вы уничтожаете URL обратного вызова, вставляя в него » «. Обратите внимание, что это закодированное пространство.

Ответ №1:

Вы должны переработать свое поведение, чтобы вместо этого использовать динамические дополнительные параметры.

 @Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes)
{
    super.updateAjaxAttributes(attributes);

    String undoEn = "return {'undoEn': editor.undoManager.hasUndo()}";
    attributes.getDynamicExtraParameters().add(undoEn);
}
  

И:

 settings.addCustomSetting(
        "setup: function(editor) {"  
        "  editor.on('NodeChange', function(e) {"  
        "    editor.save();"  
        "    "   getCallbackScript()   ";"  
        "  });"  
        "}");
  

Комментарии:

1. По какой-то причине ваш код добавляет обновление страницы infinity. В журналах консоли я вижу, что наш AJAX url вызывает

2. Трудно сказать без отладчика или журналов. Вызывается ли поведение повторно или обновляется вся страница?

3. Обновляется вся страница.

4. org.apache. исключение wicket.core.request.mapper.StalePageException: запрос на страницу ‘[Класс страницы = x.x.x.CardPage, id = 25, количество отображений = 1]’ был выполнен с устаревшим ‘renderCount’. Страница будет повторно отображена.

5. чтобы предотвратить повторное обновление страницы, я удалил первый вызов (пока текст / модель) все еще не загружен в редактор) «if (editor.UndoManager.hasUndo()) { » » console.debug(‘Behave called ‘);» behave.getCallbackScript() // «;» » }»