Angular ng-view/routing not working in PhoneGap

后端 未结 5 587
误落风尘
误落风尘 2020-11-27 12:10

I\'m having a problem with ngView in PhoneGap.

Everything seems to be loading just fine and I can even get a basic controller working using ng-controller. But when I

相关标签:
5条回答
  • 2020-11-27 12:28

    I was able to resolve the issue by disabling the local access policy flags in Google Chrome.

    $ open -a Google\ Chrome --args --disable-web-security for Mac OS.
    

    Here is the link to how to disable local access file policy.

    0 讨论(0)
  • 2020-11-27 12:30

    My issue was the domain whitelisting.

    Basically your .config needs to look like this:

    angular.module('App', []).config(function ($routeProvider, $compileProvider) {
    
        $routeProvider.when('/test', {
            controller: TestCtrl,
            template: '<h1> {{ test }} </h1>'        
        });
        $compileProvider.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|tel):/);
    });
    
    0 讨论(0)
  • 2020-11-27 12:38

    FWIW - here's my 2 cents for this problem:

    All of the above seemed to work and promote me towards a working app but I still couldn't get the $routeprovider to navigate between pages...

    MY FINAL problem was - I had an include inside a script tag of the jqueryMobile library and it was hijacking the URL requests before Angular got hold of them. When I removed it the navigation requests finally made it to the $routeprovider and all is working fine now.

    Hope this helps someone...

    0 讨论(0)
  • 2020-11-27 12:40

    Angular 1.2 does not provide the method

    $compileProvider.urlSanitizationWhitelist(/^\s*(https?|ftp|mailto|file|tel):/)
    

    Anyway, it seems like it's not necessary anymore. I tested it on my mobile and it works without.

    0 讨论(0)
  • 2020-11-27 12:44

    After searching through several questions and forums, I've finally got it working reliably. This is what it took me to get it running from a clean PhoneGap project.

    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>
    

    Note the <html ng-app="App"> tag. The app won't load without a value for the directive, so make sure you include one.

    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);
            });
        },
    };
    

    In this file, we're manually bootstrapping Angular when PhoneGap fires the 'ondeviceready' event.

    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'
        });
    });
    

    This file has two important things in it. First, we're creating the module with the same name we used before in <html np-app="App">. Second, we need to configure the router to whitelist file URIs. I personally didn't need this, but several people seem to have encountered the issue, so I included it.

    controllers.js

    function TestCtrl($scope) {
        $scope.status = "It works!";
    }
    
    function ViewCtrl($scope) {
        $scope.status = "Also totally works!";
    }
    

    Finally, just some basic controllers.

    I've created a github repo with all of this here.

    Hope this helps someone else.

    0 讨论(0)
提交回复
热议问题