一尘不染

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

angularjs

我在使用AngularJS v1.2.0和PhoneGap / Cordova
Android应用程序进行路径查找时遇到麻烦。html5mode(true)通过设置<base href="."/>index.html然后更改$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模块将对file://的访问权限列入白名单,但这无济于事。

我如何$location.path()做与redirectTo加载部分相同的事情?还是有其他方法可以解决此问题?

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

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

但这似乎是一种黑客行为,并且仍然会导致该路径中的templateUrl失败,并出现相同的异常。

有什么想法可能有问题吗?难道html5mode(true)暂时无法在Phonegap上正常工作,并且解决此问题的唯一方法是将其设置为false并向每个路径添加井号(就像在有角度的phonegap
种子项目中一样)?


阅读 193

收藏
2020-07-04

共1个答案

一尘不染

供以后参考,这是我设法解决该问题的方法:

  1. html5mode(true)由于insecurl我报告的问题,AngularJS当前似乎在Cordova应用程序中不支持。我要做的就是添加
    var h5m = (typeof html5Mode !== 'undefined') ? html5Mode : true;
    

    $locationProvider.html5Mode(h5m);

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

    <script>
  var html5Mode = false;
</script>
  1. 因此,现在$location.path('/login')以及它都redirectTo: 'login'可以,但是html文件中的链接没有。为了使那些在html5Mode被禁用的情况下在PhoneGap中工作的人,我必须#/在每个链接(例如)之前添加<a href="#/login">login</a>

  2. 这样可以使PhoneGap正常工作,但会破坏将History API与结合使用的网页html5Mode(true)。最后一个难题是将其添加<base href="/"/>到网页的index.html中(并将其排除在PhoneGap项目的index.html中。)因此,即使我#/login在网页中有一个链接,也可以进入网址,http://example.com/login并且在地址栏中看不到任何哈希值。

**

所以,最后我有历史API的工作在我的网页
历史API中的PhoneGap项目(那里实在没有必要对历史API,因为没有地址栏)禁用。唯一的缺点是#/我必须在每个模板html文件中添加额外的内容,但是与将所有相同的html和javascript文件同时用于网络和移动设备的功能相比,这是一个小麻烦。

2020-07-04