Grails 刷新浏览器会绕过基于routerProvider的URL
我有一个支持angularjs前端的grails应用程序。它们作为一场战争部署。我已从应用程序中删除了上下文路径,以便它在Grails 刷新浏览器会绕过基于routerProvider的URL,grails,angularjs,Grails,Angularjs,我有一个支持angularjs前端的grails应用程序。它们作为一场战争部署。我已从应用程序中删除了上下文路径,以便它在http://localhost:8080 我有一个文章列表,我有$routeProvider设置将/重定向到/articles,此时控制器接管并通过$http提取列表。相当标准的东西 最初,我使用默认的位置提供程序配置,在URL中使用哈希值(#)。我已经通过 $locationProvider.html5Mode(true); 而且一切都还正常。但是,如果我直接在地址栏中
http://localhost:8080
我有一个文章列表,我有$routeProvider
设置将/
重定向到/articles
,此时控制器接管并通过$http
提取列表。相当标准的东西
最初,我使用默认的位置提供程序配置,在URL中使用哈希值(#)
。我已经通过
$locationProvider.html5Mode(true);
而且一切都还正常。但是,如果我直接在地址栏中更改URL并按enter键,或者当浏览器位于/articles时我只是刷新浏览器,服务器端就会接管,我只会将文章列表作为json。没有棱角。我理解为什么会发生这种情况,现在我所做的是在服务器上检测到一个非ajax请求,并发出一个重定向到/
,这将允许angular启动
我想知道这是不是对的。或者我还能做些什么更好的练习。刚刚回答了这个问题
请确保您在服务器上正确地重写规则重定向是正确的解决方案 我能够使用url映射使其工作。到目前为止,它是有效的:-) 我是这样开始的:
"/**" (controller: 'app', action: 'index')
class UrlMappings {
static excludes = [
"/lib/**",
"/css/**",
"/js/**"
]
static mappings = {
// - all client uris (routes) will start with '/client/',
// - all server uris (load) will start with '/server/'
// redirect /$appName/ to /$appName/client
"/" (controller: 'redirect', action: 'redirectTo') {
to = '/client/'
permanent = true
}
// redirect any angular route
"/client/**" (controller: 'app', action: 'index')
// standard controller/action mapping
"/server/$controller/$action/$id?" {
constraints {
}
}
}
}
$routeProvider.when ('/client/login', {templateUrl: './server/security/login'});
应用程序/索引为角度应用程序页面。但这也将匹配其他所有内容(例如,/$controller/$action)。我必须明确地将每个$controller/$操作映射到正确的控制器。不太好…;-)
为了解决这个问题,我在所有URI前面加上/client
作为角度路由的前缀,在/server
作为GrailsURI的前缀。这使得url映射变得容易,并且有助于区分角度路由和模板URI等
我的最终url映射如下所示:
"/**" (controller: 'app', action: 'index')
class UrlMappings {
static excludes = [
"/lib/**",
"/css/**",
"/js/**"
]
static mappings = {
// - all client uris (routes) will start with '/client/',
// - all server uris (load) will start with '/server/'
// redirect /$appName/ to /$appName/client
"/" (controller: 'redirect', action: 'redirectTo') {
to = '/client/'
permanent = true
}
// redirect any angular route
"/client/**" (controller: 'app', action: 'index')
// standard controller/action mapping
"/server/$controller/$action/$id?" {
constraints {
}
}
}
}
$routeProvider.when ('/client/login', {templateUrl: './server/security/login'});
您无法在url映射中直接重定向,因此我使用一个简单的控制器:
class RedirectController {
def redirectTo () {
redirect (uri: params.to, permanent: params.permanent)
}
}
路由条目如下所示:
"/**" (controller: 'app', action: 'index')
class UrlMappings {
static excludes = [
"/lib/**",
"/css/**",
"/js/**"
]
static mappings = {
// - all client uris (routes) will start with '/client/',
// - all server uris (load) will start with '/server/'
// redirect /$appName/ to /$appName/client
"/" (controller: 'redirect', action: 'redirectTo') {
to = '/client/'
permanent = true
}
// redirect any angular route
"/client/**" (controller: 'app', action: 'index')
// standard controller/action mapping
"/server/$controller/$action/$id?" {
constraints {
}
}
}
}
$routeProvider.when ('/client/login', {templateUrl: './server/security/login'});
有一个原因可以解释为什么不能使用
#
s的标准方式?不完全是这样。我只是想学习angularjs,并尝试不同的方法,看看什么最适合我想要实现的目标。