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

Posted

技术标签:

【中文标题】AngularJS 和 PhoneGap:$location.path 导致后续 tempateUrl 查找失败【英文标题】:AngularJS and PhoneGap: $location.path causes subsequent tempateUrl lookup to fail 【发布时间】:2013-11-27 06:05:03 【问题描述】:

我无法使用 AngularJS v1.2.0 和 PhoneGap/Cordova android 应用程序进行路径查找。通过在 index.html 中设置 <base href="."/> 然后将 $routeProvider.when('/') 更改为 $routeProvider.when('/android_asset/www/index.html'),我已经与 html5mode(true) 取得了相当大的进展。之后,我可以让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();

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

对可能出现的问题有任何想法吗?是不是 html5mode(true) 目前在 Phonegap 上不起作用,解决此问题的唯一方法是将其设置为 false 并向每个路径添加主题标签(就像在角度 phonegap seed project 中所做的那样)?

【问题讨论】:

【参考方案1】:

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

    AngularJS 目前似乎不支持 Cordova 应用程序中的 html5mode(true),因为我报告了 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,我必须在每个链接前面添加#/,例如&lt;a href="#/login"&gt;login&lt;/a&gt;

    这使得 PhoneGap 可以工作,但会破坏使用 History API 和 html5Mode(true) 的网页。难题的最后一块是将&lt;base href="/"/&gt; 添加到网页的 index.html 中(并将其从 PhoneGap 项目的 index.html 中删除。)所以现在即使我在网页,我访问了网址http://example.com/login,但在地址栏中没有看到任何哈希值。

**

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

【讨论】:

天哪,这太棒了。非常感谢您提供此解决方案。 抱歉,我在任何地方都没有简单的工作示例。到底什么不适合你? app.config(['$locationProvider', function ($locationProvider) $locationProvider.html5Mode(false); ]);【参考方案2】:

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

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

【讨论】:

以上是关于AngularJS 和 PhoneGap:$location.path 导致后续 tempateUrl 查找失败的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS/Cordova/Phonegap Ipad 3 和 Iphone 4s 不够快?

PhoneGap 上 Angularjs/Javascript 应用程序的最佳数据持久性? [关闭]

使用 PhoneGap 下载文件并在 AngularJS 中使用

从 AngularJS 控制器调用 phonegap 插件

iOS 的 Ionic/AngularJS/Phonegap 键盘问题

使用 AngularJS 在 iOS 的 PhoneGap 3.3 中登录 XCODE