PhoneGapのngViewに問題があります。
すべてがうまくロードされているようで、ng-controllerを使用して基本的なコントローラを動作させることさえできます。しかし、ngViewでルーティングを使用しようとしても、何も起こりません。
index.html
_<!doctype html>
<html ng-app>
<head>
<script type="text/javascript" src="lib/cordova-2.4.0.js"></script>
<script type="text/javascript" src="lib/angular-1.0.4.min.js"></script>
<script type="text/javascript" src="js/app.js"></script>
</head>
<body>
<a href="#/test">Test</a>
<div ng-view></div>
</body>
</html>
_
app.js
_angular.module('App', []).config(function ($routeProvider) {
$routeProvider.when('/test', {
controller: TestCtrl,
template: '<h1> {{ test }} </h1>'
});
});
function TestCtrl($scope) {
$scope.test = "Works!";
}
_
EclipseロガーはリンクをクリックするたびにonMessage(onPageFinished, fle:///Android_asset/www/index.html#/test)
を表示し、_#
_なしでリンクを試みると、パスが見つからないというエラーが発生します。
他のどこでも準備ができていることから、これはうまくいくはずです。どんな助けも大歓迎です。
いくつかの質問やフォーラムを検索した結果、ようやく確実に機能するようになりました。これが、クリーンなPhoneGapプロジェクトから実行するために必要なことです。
index.html
<!DOCTYPE html>
<html ng-app="App">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="format-detection" content="telephone=no" />
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, height=device-height, target-densitydpi=device-dpi" />
<link rel="stylesheet" type="text/css" href="css/index.css" />
<title>Hello World</title>
</head>
<body>
<a href="#/">Main View</a>
<a href="#/view">New View</a>
<div ng-view></div>
<!-- Libs -->
<script type="text/javascript" src="lib/cordova-2.5.0.js"></script>
<script type="text/javascript" src="lib/angular-1.0.5.js"></script>
<!-- App -->
<script type="text/javascript" src="js/index.js"></script>
<script type="text/javascript" src="js/routers.js"></script>
<script type="text/javascript" src="js/controllers.js"></script>
<script type="text/javascript">
app.initialize();
</script>
</body>
</html>
<html ng-app="App">
タグに注意してください。ディレクティブの値がないとアプリはロードされないため、必ず含めてください。
index.js
var app = {
initialize: function() {
this.bindEvents();
},
bindEvents: function() {
document.addEventListener('deviceready', this.onDeviceReady, true);
},
onDeviceReady: function() {
angular.element(document).ready(function() {
angular.bootstrap(document);
});
},
};
このファイルでは、PhoneGapが'ondeviceready'
イベントを発生させたときにAngularを手動でブートストラップしています。
routers.js
angular.module('App', [])
.config(function ($compileProvider){
$compileProvider.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|tel):/);
})
.config(function ($routeProvider) {
$routeProvider
.when('/', {
controller: TestCtrl,
templateUrl: 'partials/main.html'
})
.when('/view', {
controller: ViewCtrl,
templateUrl: 'partials/view.html'
});
});
このファイルには、2つの重要な要素が含まれています。まず、以前に<html np-app="App">
で使用したのと同じ名前でモジュールを作成します。次に、ファイルURIをホワイトリストに登録するようにルーターを構成する必要があります。私は個人的にこれを必要としませんでしたが、何人かの人々が問題に遭遇したようですので、それを含めました。
controllers.js
function TestCtrl($scope) {
$scope.status = "It works!";
}
function ViewCtrl($scope) {
$scope.status = "Also totally works!";
}
最後に、ほんのいくつかの基本的なコントローラー。
このすべてでgithubリポジトリを作成しました here 。
これが他の誰かに役立つことを願っています。
私の問題はドメインのホワイトリスト登録でした。
基本的に、.configは次のように見える必要があります。
angular.module('App', []).config(function ($routeProvider, $compileProvider) {
$routeProvider.when('/test', {
controller: TestCtrl,
template: '<h1> {{ test }} </h1>'
});
$compileProvider.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|tel):/);
});
FWIW-この問題に対する私の2セントです:
上記のすべてが機能し、動作しているアプリに向かって昇進するように見えましたが、ページ間を移動するために$ routeproviderを取得できませんでした...
私の最終的な問題は-jqueryMobileライブラリのスクリプトタグ内にインクルードがあり、Angularがそれらを保持する前にURLリクエストをハイジャックしていました。 $ routeproviderにアクセスすると、すべて正常に動作しています。
これが誰かを助けることを願っています...
Google Chromeでローカルアクセスポリシーフラグを無効にすることで問題を解決できました。
$ open -a Google\ Chrome --args --disable-web-security for Mac OS.
ローカルアクセスファイルポリシーを無効にする方法の link を次に示します。
Angular 1.2はメソッドを提供しません
$compileProvider.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|tel):/)
とにかく、もう必要ないようです。私は自分の携帯電話でテストしましたが、機能しません。