Removing # from url in Angularjs while having .run in routes

后端 未结 7 609
感情败类
感情败类 2020-11-27 07:02

Here is my app.js route file in AngularJS

var app = angular.module(\'myApp\', [\'ngRoute\', \'ngAnimate\', \'toaster\']);
app.config([\'$routeP         


        
相关标签:
7条回答
  • 2020-11-27 07:18

    Why do you want to use the .run() ? Add <base href="/" /> to you <head> or start of your body (first line) and then to match the logic of your .run() try this ( .otherwise("/path") to your $routeProvider):

    var app = angular.module('myApp', ['ngRoute', 'ngAnimate', 'toaster']);
    app.config(['$routeProvider', '$locationProvider',
        function ($routeProvider, $locationProvider) {
            $routeProvider.
                    when('/login', {
                        title: 'Login',
                        templateUrl: 'resources/views/layouts/loginUser.php',
                        controller: 'authCtrl'
                    })
                    .when('/', {
                        title: 'Login',
                        templateUrl: 'resources/views/layout/login.php',
                        controller: 'logoutCtrl'
                    })
                    .when('/reset', {
                        title: 'Reset Password',
                        templateUrl: 'resources/views/layouts/forgetPassword.php',
                        controller: 'authCtrl'
                    })
                    .when('/invalidtoken', {
                        title: 'Login',
                        templateUrl: 'resources/views/layout/invalidtoken.php',
                        controller: 'authCtrl',
                        role: '0'
                    })
    . otherwise("/");
               $locationProvider.html5Mode(true);
        }]);
    

    If you still face issues, I recommend https://github.com/angular-ui/ui-router

    Update:

    your index.html

    <!DOCTYPE html>
    <html lang="en" ng-app="myApp">
    <head>
            <meta charset="utf-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta name="viewport" content="width=device-width,initial-scale=1">
            <title>Green Hopping</title>
            <link rel="shotcut icon" type="favicon.ico" href="public/images/favicon.ico" />
            <link rel="icon" type="favicon.ico" href="public/images/favicon.ico" />
            <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.2/angular.min.js"></script>
            <script src="https://code.angularjs.org/1.4.2/angular-route.min.js"></script>
    
        </head>
        <body ng-cloak="">
          <base href="/">
            <div data-ng-view="" id="ng-view" class="slide-animation"></div>
        </body>
    
        <script>
          var app = angular.module('myApp', ['ngRoute']);
            app.config(['$routeProvider', '$locationProvider',
                function ($routeProvider, $locationProvider) {
                    $routeProvider.
                            when('/', {
                                title: 'Home',
                                templateUrl: 'home.html',
                                controller: 'homeCtrl'
                            })
                            .when('/login', {
                                title: 'Login',
                                templateUrl: 'login.html',
                                controller: 'authCtrl'
                            })
                            .when('/logout', {
                                title: 'Logout',
                                templateUrl: 'logout.html',
                                controller: 'logoutCtrl'
                            })
                            .when('/dashboard', {
                                title: 'Dashboard',
                                templateUrl: 'dashboard.html',
                                controller: 'dashboardCtrl'
                            })          
                            .otherwise('/');              
                            $locationProvider.html5Mode(true);
                }])
            .run(function ($rootScope, $location, $http, loginSrv) {
                $rootScope.$on("$routeChangeStart", function (event, next, current) {
                        var nextUrl = next.$$route.originalPath;
                        var orUseUrl = $location.path();
                        console.log(nextUrl);
                        if (nextUrl === '/logout'){loginSrv.logout();}
                        if (nextUrl === '/login'){loginSrv.login();}
                        if (loginSrv.loggedin === false) { $location.path('/'); } 
                        else { $location.path(nextUrl); }
                });
            });
            app.service("loginSrv",function(){
              var ls= this;
              ls.loggedin = false;
              ls.logout = function(){
                ls.loggedin = false;
              }
              ls.login = function(){
                ls.loggedin = true;
              }
            });
            app.controller("homeCtrl",function($scope, loginSrv){
              $scope.loggedin = loginSrv.loggedin;
            })     
            app.controller("dashboardCtrl",function($scope, loginSrv){
              $scope.loggedin = loginSrv.loggedin;
            })                    
            app.controller("authCtrl",function($scope, loginSrv){
              $scope.loggedin = loginSrv.loggedin;
            })
            app.controller("logoutCtrl",function($scope, loginSrv){
              $scope.loggedin = loginSrv.loggedin;
            })        
        </script>
    
    </html>
    

    All other templates are same like this. Copy paste the following for home.html , login.html , dashboard.html , logout.html . Plunker will not be able to show issues with routes for client side. Try this. This is completely functional code.

    <div>
        <div><a href="/">Home</a> | 
        <a href="/login">Login</a> | 
        <a href="/dashboard">Dashboard</a> | 
        <a href="/logout">Logout</a></div>
    
        <div> This is from the home/login/dashboard/logout Controller. Loggedin: {{loggedin}}</div>
    </div>
    
    0 讨论(0)
  • 2020-11-27 07:18

    try changing:

    $locationProvider.html5Mode(true);
    

    To:

    $locationProvider.html5Mode({
       enabled: true,
       requireBase: false
    });
    
    0 讨论(0)
  • 2020-11-27 07:19

    it does not look possible you to remove hash-bang (#) from href manually, and it causes malfunction your router because hashbangs are enables browser not treat your state in order to send get request to an end point. browser does not fire a get request over #/route while it does over /route, unless you use your url provider in html5 mode. For html5 mode, add the line below into your app.config function:

    $locationProvider.html5Mode(true).hashPrefix('!')
    
    0 讨论(0)
  • 2020-11-27 07:29

    With html5mode you have to specify the base url in your html file for eg,

    <base href="/">
    

    Some links you can go through for your reference,

    https://docs.angularjs.org/error/$location/nobase

    https://scotch.io/quick-tips/pretty-urls-in-angularjs-removing-the-hashtag

    0 讨论(0)
  • 2020-11-27 07:35

    The problem is it is missing the service injection. So in config section try injecting $locationProvider like below.

    app.config(['$routeProvider', '$locationProvider',
    function ($routeProvider, $locationProvider) {
        $routeProvider.
                when('/login', {
                    title: 'Login',
                    templateUrl: 'resources/views/layouts/loginUser.php',
                    controller: 'authCtrl'
                })
                .when('/', {
                    title: 'Login',
                    templateUrl: 'resources/views/layout/login.php',
                    controller: 'logoutCtrl'
                })
                .when('/reset', {
                    title: 'Reset Password',
                    templateUrl: 'resources/views/layouts/forgetPassword.php',
                    controller: 'authCtrl'
                })
                .when('/invalidtoken', {
                    title: 'Login',
                    templateUrl: 'resources/views/layout/invalidtoken.php',
                    controller: 'authCtrl',
                    role: '0'
                })
    
                $locationProvider.html5Mode(true);
    }])
    
    0 讨论(0)
  • 2020-11-27 07:38

    You can't inject $locationProvider in .run because providers are only available for .config

    This answer should help but you will have 2 issues:

    1. You will need a check before $locationProvider.html5Mode(true) as it will not work on IE 10 or older.

      if(window.history && window.history.pushState){
          $locationProvider.html5Mode(true);
      } 
      
    2. This will work only by removing the # when the user enters it in the url, i.e. if the users types app/#/login it will change to app/login. However, if the user bookmarks or copies the changed url app/login and enters that in the browser he will get an error as the server does not know about angular routing since it is client side only. In the thread I linked above you may find some comments on how to fix this.

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