2010-01-07 55 views
0

我在浏览器的后退按钮在Web流中正常工作时遇到问题。 grails的版本是1.1.2。 想象示例代码:Grails Web浏览器的后退按钮流问题

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,两者都做同样的事情,一个重定向到另一个状态。但是我需要一个更多的动作状态,以便能够区分按下后退和前进按钮时的实际状态。这个构造有效,但我更喜欢更简单的方法。

感谢您的任何答案

汤姆

回答

2

到目前为止,我已经找到了唯一的解决办法就是我提到的一个。使用两种视图状态,两种视图状态完全相同,一种状态信息保存一些状态信息(如果没有它,很难正确区分已处理的成员)。该代码将是这样的:

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 { 
     ... 
    } 
} 

由于视图正在改变每一个成员,执行参数也正在发生变化,网址是截然不同的每一个成员。 Firefox根据URL区分查看的页面,因此您可以使用后退和前进按钮在所有成员之间来回切换。

Web流程将URL与流对象的当前状态进行映射。因此,在几次后退按钮后,很容易区分正在处理的当前成员。