我在使用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中完成的那样)?
答案 0 :(得分:14)
为了将来参考,这就是我设法解决问题的方法:
由于我报告的html5mode(true)
问题,AngularJS目前似乎不支持Cordova应用程序中的insecurl
。我要做的就是添加
var h5m = (typeof html5Mode !== 'undefined') ? html5Mode : true;
$locationProvider.html5Mode(h5m);
这使我有可能使用全局变量在PhoneGap index.html
中显式设置html5Mode:
<script>
var html5Mode = false;
</script>
所以现在$location.path('/login')
以及redirectTo: 'login'
都有效,但html文件中的链接却没有。为了让那些在PhoneGap中工作的人禁用html5Mode,我必须在每个链接前添加#/
,例如<a href="#/login">login</a>
。
这使PhoneGap工作,但打破了使用历史记录API html5Mode(true)
的网页。最后一个难题是将<base href="/"/>
添加到网页的index.html(并将其保留在PhoneGap项目的index.html之外。)所以现在即使我有一个链接说{{1}在网页中,我访问了网址#/login
,并且在地址栏中看不到任何哈希值。
**
所以最后我在我的网页中使用了历史记录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.