10

我无法使用 AngularJS v1.2.0 和 PhoneGap/Cordova Android 应用程序进行路径查找。通过在index.htmlhtml5mode(true)中设置<base href="."/>然后更改$routeProvider.when('/')$routeProvider.when('/android_asset/www/index.html'). 之后,我可以redirectTo('login')到达并按预期进行$routeProvider.when('/login')渲染。templateUrl: 'static/partials/login.html'

我遇到的问题是,如果我尝试使用 Javascript 代码从我的 Javascript 代码重定向到登录页面$location.path('/login');,则会找到路由,但 templateUrl 加载失败并出现insecurl异常。

我尝试使用新的 angular-sanitize 模块将访问 file:// 列入白名单,但这没有帮助。

我怎样才能做与加载部分$location.path()相同的事情?redirectTo或者有没有其他方法可以解决这个问题?

更新:通过在路径函数之后添加对 replace() 的调用,我有点前进了,例如:

$location.path('/login').replace();

但这似乎是一个 hack,它仍然会导致其他路由中的 templateUrl 失败并出现相同的异常。

关于什么可能是错的任何想法?是不是 html5mode(true) 此刻不能与 Phonegap 一起使用,解决此问题的唯一方法是将其设置为 false 并将主题标签添加到每个路径(就像在 angular phonegap种子项目中所做的那样)?

4

2 回答 2

14

为了将来参考,这是我设法解决问题的方法:

  1. 由于我报告的问题, AngularJS 目前似乎不支持html5mode(true)Cordova 应用程序。insecurl我必须做的是添加

    var h5m = (typeof html5Mode !== 'undefined') ? html5Mode : true;
    $locationProvider.html5Mode(h5m);
    

    index.html这使我可以使用全局变量在 PhoneGap 中显式设置 html5Mode :

    <script>
      var html5Mode = false;
    </script>
    
  2. 所以现在$location.path('/login')redirectTo: 'login'作品一样,但 html 文件中的链接,不要。为了让那些在 PhoneGap 中工作的人禁用 html5Mode,我必须#/在每个链接前面添加,例如<a href="#/login">login</a>.

  3. 这使得 PhoneGap 可以工作,但会破坏使用 History API 和html5Mode(true). 难题的最后一块是添加<base href="/"/>到网页的 index.html 中(并将其排除在 PhoneGap 项目的 index.html 之外。)所以现在即使我#/login在网页中有一个链接,我也可以urlhttp://example.com/login并且在地址栏中看不到任何哈希值。

**

所以最后我在我的网页使用了 History API,在 PhoneGap 项目中禁用了 History API(因为没有地址栏,所以真的不需要 History API)。唯一的缺点是#/我必须在每个模板 html 文件中添加额外的内容,但与在 web 和移动设备上使用所有相同的 html 和 javascript 文件的能力相比,这是一个小麻烦。

于 2013-11-18T18:31:23.287 回答
0

我也有同样的问题。我设法通过跳过路由配置中的前导斜杠来修复它:

 $routeProvider
        // route for the foo page
        .when('/foo', {
            templateUrl: 'foo.html', //previously: '/foo.html'
            controller: 'fooController'
        }) //etc.
于 2016-01-13T20:13:07.633 回答