我有一个grails webflow,适用于我的桌面浏览器应用程序。现在我想重新使用我的移动网站的webflow。我不希望有2个单独的Web流,只需更改用于每个州的页面。我尝试了以下方法:
viewState{
String view = 'viewState'
boolean isMobile = this.isMobileUser()
if(isMobile){
view = "/flowDir/mobile/viewState"
}
render(view:view)
}
然而这不起作用。如果首先访问移动网站,则桌面将获得移动页面,反之亦然。
有没有人遇到过这个问题?我真的很讨厌有2个webflows做同样的事情。我也讨厌入侵Sitemesh。任何有关如何重用此流程的想法或建议将不胜感激。
答案 0 :(得分:0)
尝试将移动视图分辨率放入后置过滤器,以便您的Web流程执行相同的操作,但您可以截取正在渲染的视图并重命名它。
答案 1 :(得分:0)
我同意droggo的观点,即响应式设计是最佳解决方案。
但是,作为替代方案,您可能会让所有webflow用户访问相同的视图,但在该视图中,您可以使用自己的taglib覆盖g:layout taglib,以确定您是否是是否以移动用户身份运行,因此可以应用适当的布局。
在这种情况下,它可能有点沉重,但它会为您提供一个可以在整个应用程序中重复使用的解决方案,而不仅仅是在Webflow中,并且它将特定于移动设备的代码保存在一个位置。
所以在你的网络流程中:
viewState{
String view = 'viewState'
[snip] The rest of your code goes here
render(view:view)
}
然后你的观点:
<myapp:applyLayout name="someWebflowLayout">
[snip] Your non-layout GSP code goes here
</myapp:applyLayout>
然后你的taglib:
class MyAppTagLib {
static namespace = "myapp"
def applyLayout = { attrs, body ->
boolean mobileUser = false
[snip] some logic to determine if this is a mobile user or not goes here
if (mobileUser) {
attrs.name = "mobileLayout/${attrs.name}"
} else {
attrs.name = "desktopLayout/${attrs.name}"
}
out << g.applyLayout(attrs, body)
}
}
然后你会有两个名为someWebflowLayout的布局文件 - 一个在/ layouts / mobileLayout中,一个在/ layouts / desktopLayout内(虽然我很欣赏这些可能与你现有的结构不完全匹配)
上面的taglib中的代码只是一个粗略的指南,它需要支持来处理g:applyLayout所需的其他参数。