1

我有一个支持 angularjs 前端的 grails 应用程序。它们被部署为单个 WAR。我已经从应用程序中删除了上下文路径,以便它在http://localhost:8080.

我有一个文章列表,并且我有$routeProvider设置重定向//articles控制器接管并通过$http. 很标准的东西。

最初,我使用默认位置提供程序配置,因为(#)URL 中使用了哈希值。我已经通过

$locationProvider.html5Mode(true);

一切仍然有效。但是,如果我直接在地址栏中更改 URL 并按 Enter 键,或者如果我只是在 /articles 处刷新浏览器,则服务器端会接管并且我只是将我的文章列表作为 json 获取。没有棱角。我理解为什么会发生这种情况,现在我所做的是在服务器上检测到一个非 ajax 请求,并发出一个重定向,/这将允许 angular 启动。

我想知道这是否正确。或者还有什么我可以做的更好的做法。

4

2 回答 2

3

重定向是正确的解决方案。

我能够使用 url 映射使其工作。到目前为止它有效:-)

我从这样的事情开始:

"/**" (controller: 'app', action: 'index') 

app/index 是 Angular 应用页面。但这也将匹配其他所有内容(例如 /$controller/$action)。我必须将每个 $controller/$action 显式映射到正确的控制器。不太好... ;-)

为了解决这个问题,我在所有 uris 前面加上/clientangular route 和/servergrails uris。这使得 url 映射变得容易,它有助于区分角度路由和模板 uris 等。

我的最终 url 映射如下所示:

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

不能直接在 url 映射中重定向,所以我使用一个简单的控制器:

class RedirectController {
    def redirectTo () {
        redirect (uri: params.to, permanent: params.permanent)
    }
}

路由条目如下所示:

$routeProvider.when ('/client/login', {templateUrl: './server/security/login'});
于 2013-07-27T08:52:31.807 回答
0

刚刚在这里回答了这个问题 angularjs html5mode refresh page get 404

确保您在服务器上重写规则正常工作

于 2013-07-27T08:48:24.237 回答