AngularJS和PhoneGap:$ location.path导致后续的tempateUrl查找失败

时间:2013-11-14 09:36:39

标签: angularjs cordova angularjs-routing

我在使用AngularJS v1.2.0和PhoneGap / Cordova Android应用程序进行路径查找时遇到问题。通过在index.html中设置html5mode(true),然后将<base href="."/>更改为$routeProvider.when('/'),我与$routeProvider.when('/android_asset/www/index.html')相距甚远。之后,我可以redirectTo('login')到达$routeProvider.when('/login')并按预期呈现templateUrl: 'static/partials/login.html'

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

我尝试使用新的angular-sanitize模块将文件列入白名单,但这没有用。

如何让$location.path()执行与redirectTo相同的操作,以便加载部分?或者还有其他方法可以解决这个问题吗?

UPDATE :我在路径功能之后添加了对replace()的调用,例如:

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

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

关于可能出错的任何想法?是不是html5mode(true)在这个时候用Phonegap不起作用,解决这个问题的唯一方法是将它设置为false并将hashtags添加到每个路径(就像在有角度的phonegap seed project中完成的那样)?

2 个答案:

答案 0 :(得分:14)

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

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

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

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

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

  3. 这使PhoneGap工作,但打破了使用历史记录API html5Mode(true)的网页。最后一个难题是将<base href="/"/>添加到网页的index.html(并将其保留在PhoneGap项目的index.html之外。)所以现在即使我有一个链接说{{1}在网页中,我访问了网址#/login,并且在地址栏中看不到任何哈希值。

  4. **

    所以最后我在我的网页中使用了历史记录API 在PhoneGap项目中禁用了历史记录API(因为没有地址栏,所以真的不需要历史记录API)。唯一的缺点是我必须在每个模板html文件中添加额外http://example.com/login,但与使用所有相同的html和javascript文件进行网络和移动的能力相比,这是一个小麻烦。

答案 1 :(得分:0)

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

 $routeProvider
        // route for the foo page
        .when('/foo', {
            templateUrl: 'foo.html', //previously: '/foo.html'
            controller: 'fooController'
        }) //etc.