Как включить всплывающее диалоговое окно в подпоток

Есть ли способ вызвать диалоговое окно внутри состояния подпотока, чтобы фон (текущий поток) отключился?

Чтобы после завершения подпотока (после закрытия всплывающего диалогового окна) он мог обновить родительский поток (текущую страницу).

Я пытаюсь добиться чего-то вроде рисунка ниже с подпотоком:

Обновить:

В конце я использовал следующий код в веб-потоке для динамического создания диалогового окна на ходу:

<render fragments="dialogContent"/>

1 ответ

Решение

Я не думаю, что переходы родительского потока -> подпотока были разработаны для такой проблемы. Веб-поток предполагает, что вы переходите со страницы -> страница. Лучше всего сделать вызов ajax/javascript во время инициализации всплывающего окна для определенного перехода, определенного в родительском / основном потоке, и поместить логику, которую вы хотите выполнить, в переход. Вы можете настроить Spring Webflow так, чтобы он возвращал фрагменты HTML, которые будут отображаться только вашим кодом JavaScript.

Вот пример из одного из моих проектов.

  <view-state id="edit" view="flows/s/#{flowScope.modelPathName}/v/edit" model="modelObj">              
        <!--  NOTE: Inheriting flow must implement its own specific binding
        <binder>
            <binding property="name" /> 
            <binding property="description" />
        </binder> 
         -->

        <transition on="saveModel" to="chkLocalmodelObjDiff"/>
        <transition on="cancelSave" to="cancelEdit" bind="false"/> 
        <transition on="objUnlink">
            <set name="flashScope.viewResponse" value="pbmService.removeObjRelationship(requestParameters.objId,requestParameters.objName,modelObj)"/>

            <render fragments="view_response_msg" />
        </transition>

так что в приведенном выше примере мы находимся в нашем "родительском / основном" потоке. переход "objUnlink" может быть инициирован любой HTML-ссылкой, которая выглядит следующим образом.

(код sudo):

${flowExecutionUrl}?_eventId='objUnlink'&someOtherParam=2

Требуется ПАРАМ для запуска перехода: "_eventId = objUnlink"

или через вызов ajax, где URL структурирован так:

(код sudo):

${flowExecutionUrl}?_eventId='objUnlink'&someOtherParam=2&ajaxSource=true

Необходимые параметры PARAM для запуска перехода через ajax: "_eventId = objUnlink" и "ajaxSource=true"

Потому что у нас есть:

<render fragments="view_response_msg" />

При запуске любого URL будет отображаться только фрагмент view_response_msg, как определено вашим представлением. В моем случае я использую thymeleaf в качестве моей структуры представления, а view_response_msg определяется как фрагмент в thymeleaf.

Поэтому после отправки запроса и выполнения перехода мое тело ответа будет состоять только из визуализированного html, который был определен в моем view_response_msg (а не всей страницы).

Поэтому для вашего случая использования вы должны:

  1. Определите фрагмент в вашей структуре представления, который будет отображать только содержимое всплывающего окна. Чтобы соответствовать нашему примеру, назовем его "view_response_msg"

  2. Затем вызовите определенный переход на родительском / основном потоке через AJAX. Снова, чтобы остаться последовательным, назовем это 'objUnlink'

  3. Затем сохраните этот частично визуализированный ответ html в переменной javascript (помните, что мы назвали этот переход из вызова ajax), а затем отобразите его внутри всплывающего окна.

  4. Если вы хотите обновить родительский / основной поток, когда кто-то закрывает всплывающее окно, используйте ту же концепцию и создайте еще один вызов ajax -> transition -> фрагмент рендеринга. Помните, мы не покинули основной поток.

Извините за длинный ответ, но это не тривиальная проблема:)

Примечание. Spring Web Flow должен быть ЯВНО настроен для обработки запросов AJAX. Смотрите документацию. Более того, ваша специфическая структура представления может (например, thymeleaf) иметь свою собственную конкретную конфигурацию / реализацию для Web Flow для обработки ajax-запросов и для рендеринга фрагментов.

Другие вопросы по тегам