Проблема веб-потока Grails с кнопкой возврата браузера
-
19-09-2019 - |
Вопрос
У меня возникли проблемы с корректной работой кнопки возврата браузера в веб-потоке.Версия grails - 1.1.2.Представьте себе пример кода:
def someFlow = {
...
fillGroup {
on("addMember"){
...
}.to "fillMember"
}
fillMember {
on("addMember") {
...
}.to "fillMember"
on("goToCart").to "showCart"
}
showCart {
...
}
}
Теперь я добавляю группу, несколько (> 1) участников и перехожу в корзину.Проблема в том, что при заполнении элементов URL-адрес остается прежним.Параметр выполнения URL изменяется только в том случае, если изменяется состояние (вид).
Таким образом, Firefox запоминает страницы fillMember как одну страницу, потому что URL-адрес не меняется.Поэтому кнопка "Назад" не работает должным образом.Если я нахожусь на showCart и нажимаю назад, я попадаю на страницу fillMember.Дальнейшее нажатие кнопки "Назад" возвращает fillGroup.Мне это нужно, чтобы просмотреть все страницы fillMember.
Есть ли какой-нибудь способ заставить Grails web flow изменить параметр выполнения, даже если я перенаправлен в то же состояние?Или я могу поместить свой собственный параметр в URL-адрес?
Я нашел один довольно уродливый способ, как это сделать:используйте два состояния fillMember - fillMember1 и fillMember2, оба делают одно и то же, одно перенаправляет на другое.Но мне нужно еще одно состояние действия, чтобы иметь возможность отличать фактическое состояние при нажатии кнопок назад и вперед.Эта конструкция работает, но я бы предпочел более простой способ.
Спасибо за любые ответы
Том
Решение
Пока что единственное решение, которое я нашел, - это то, о котором я упоминал.Используйте два состояния просмотра, оба из которых выполняют в точности одно и то же действие, и одно состояние действия для хранения некоторой информации о состоянии (без этого было бы трудно правильно отличить обрабатываемый элемент).Код был бы примерно таким:
def someFlow = {
...
fillGroup {
on("addMember"){
...
}.to "fillMemberLogic"
}
fillMemberLogic {
action {
...
flow.stateinf += 1
if(flow.stateinf%2 == 1)
return gotoFillMember1()
else
return gotoFillMember2()
}
on("gotoFillMember1").to "fillMember1"
on("gotoFillMember2").to "fillMember2"
}
fillMember1 {
on("addMember") {
...
}.to "fillMemberLogic"
on("goToCart").to "showCart"
}
fillMember2 {
on("addMember") {
...
}.to "fillMemberLogic"
on("goToCart").to "showCart"
}
showCart {
...
}
}
Поскольку представление изменяется для каждого участника, параметр выполнения также изменяется, и URL-адрес отличается для каждого участника.Firefox различает просматриваемые страницы по URL, поэтому вы можете переходить назад и вперед по всем участникам, используя кнопки назад и вперед.
Веб-поток - это сопоставление URL-адреса с текущим состоянием объекта потока.Таким образом, после нескольких нажатий кнопки "Назад" можно легко определить текущего участника, которого вы обрабатываете.