angularJs---route

Posted 游鱼与渔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了angularJs---route相关的知识,希望对你有一定的参考价值。

route

  route---‘路由’ 

  ajax的弊端:

    1.ajax请求不会留下history记录

    2.用户无法直接通过url进入应用中的指定页面(保存书签,分享朋友?)

    3.ajax不利于SEO

 

  前端路由的实现原理是什么?

    #哈希 也叫锚点,通过使用锚点实现页面刷新但不跳转。

    html5中的history API

 

  route可以说是angular的一大重点。 route可以实现局部页面无刷新跳转(相当于页面里嵌套了页面)  

  ng官方提供了一套路由 ng-route

  

  1.引入外部文件:angular-route.js   2.把ngRoute模块注入到主模块  3.使用config函数 注入$routeProvider服务  4.在需要载入页面的地方 加上ng-view

  $routeProvider的方法:

    when(‘url’, {//code}) 该对象的属性有template/templateUrl--文件地址   controller:‘控制器名称’   url表示拼接在网址后头    #!url

    otherwise({//code}) 该方法表示默认的页面 ,接收一个对象,该对象有个属性redirectTo  表示从重定向

  需要注意的是:当设置了controller选项时,主控制器就不能用在 标签含有属性ng-view里面了。

  

<body ng-app="app">
    <div ng-controller="myCtrl">
        <a href="#!/index">index</a>
        <a href="#!/home">home</a>
        <div ng-view>
            
        </div>
    </div>
</body>
    <script src="./js/angular.js"></script>
    <script src="./js/angular-route.js"></script>
    <script>
        var app = angular.module(\'app\', [\'ngRoute\']);
        app.controller(\'myCtrl\', function($scope){
            $scope.name = \'dk\';
        })
        app.config(function($routeProvider){
            $routeProvider.when(\'/index\',{
                templateUrl:\'./temp/index.html\',
                controller: \'indexCtrl\'
            }).when(\'/home\', {
                templateUrl: \'./temp/home.html\'
            }).otherwise(\'/index\', {
                templateUrl:\'./temp/index.html\',
                controller: \'indexCtrl\'
            })
        });
        app.controller(\'indexCtrl\', function($scope){
            $scope.name = \'jjk\'
        })
    </script>

  

  在chrome中显示:

  

 

  从外部引入angular-route.js 但无法进行深层次嵌套,这时,可以选用第3方插件:angular-ui-route.js

  用ng制作的spa(单页面应用)经常有路由嵌套、路由平行的情况

    第一种情况:页面嵌套

  

  

<body ng-app="app">
    <div ng-controller="myCtrl">
        <a href="#!/index">index</a>
        <div ui-view style="border:1px solid green">
            
        </div>
    </div>
</body>
<script src="./js/angular.js"></script>
<script src="./js/angular-ui-router.js"></script>
<script>
    var app = angular.module(\'app\', [\'ui.router\']);
    app.controller(\'myCtrl\', function($scope){
        $scope.name = \'dk\';
    })
    app.config(function($stateProvider, $urlRouterProvider)
    {
        $urlRouterProvider.when(\'\', \'/index\');
        $stateProvider.state(\'index\', {
            url:\'/index\',
            templateUrl:\'./temp/index.html\'
            // controller: \'indexCtrl\'
        })
        .state(\'index.page1\',{
            url: \'/page1\',
            templateUrl: \'./temp/page1.html\'
    
        })
        .state(\'index.page2\',{
            url:\'/page2\',
            templateUrl:\'./temp/page2.html\'
        })
    })
</script>

  上面的代码中:

 $urlRouterProvider.when(\'\', \'/index\'); 表示默认页面
 url 表示在当前网址的基础上加上url
 同样可以有controller选项。

在chrome中显示:

  第2种情况:多个ui-view存在同一个页面,互为平行关系。
  body部分:


script部分:
  

  可以看出:给ui-view所在的标签一个name属性,由views选项控制所有的ui-view就可以实现一个页面多个视图。
<body>
    <a href="#!/index">index</a>
    <a href="#!/home">home</a>
    <div ui-view name=\'view1\'>

    </div>
    <div ui-view name=\'view2\'>

    </div>
    <div>
        <div ui-view name=\'view3\' style="border:1px solid red">
            
        </div>
    </div>

</body>
<script src="./js/angular.js"></script>
<script src="./js/angular-ui-router.js"></script>
<script>
    var app = angular.module(\'demo\', [\'ui.router\']);
    app.config(function ($stateProvider, $urlRouterProvider) {
        $stateProvider.state(\'index\', {
            url: \'/index\',
            views: {
                "view1": {
                    template: \'<p>index first</p>\'
                },
                "view2": {
                    template: \'<p>index second</p>\'
                },
                "view3":{
                    template:"<p>three</p>"
                }
            }
        })
            .state(\'home\', {
                url: \'/home\',
                views: {
                    "view1": {
                        template: \'<p>home first</p>\'
                    },
                    "view2": {
                        template: \'<p>home second</p>\'
                    }
                }
            })
    })
</script>

</html>

 

  在chrome中显示:

 

  路由传参:在我们平时做的页面跳转都会传参,如:https://i.cnblogs.com/EditPosts.aspx?postid=6556246&update=1, postid=6556246&update=1就是参数。那路由又是如何实现传参的呢?

  在url选项中: ‘/index/:id’  id即为参数 如果设置了参数 凡是页面/index/hot、/index/news之类的 hot news均表示参数而不是指第2层ui-view。

  一般在a标签里 实现路由跳转  有2种写法:

    1. <a href="#/index/hot"></a>   hot为参数

    2. 使用ui-sref     

    <a ui-sref="index({id:hot})">show index</a>   index表示 路由的名字   ({id:hot})表示参数

  

  监控路由的变化:

    监控路由的变化有一般有2种方式

      1. 路由状态发生改变时,可以通过监听\' $stateChangeStart \'、\' $stateChangeSuccess \'、\' $stateChangeError \'等事件

       监控路由是在run阶段,通过注入$rootScope服务,使用$on监听这些事件。

        $stateChangeStart 表示 路由状态开始改变 注意此时url还未改变了,视图还未更新。

          

        $stateChangeSuccess表示 路由状态改变完成,此时url已经改变了,视图仍没有更新。

        $stateChangeError 表示 路由状态改变错误。

        

      
      

    

var app = angular.module(\'app\', [\'ui.router\', \'routers\', \'directives\', \'controllers\', \'ionic\']);
// app.controller(\'appCtrl\',function($scope){
//     $scope.tab = \'jjk\';
// })
监听路由变化
app.run([\'$rootScope\', \'$http\', function ($rootScope,$http) {
    $rootScope.$on(\'$stateChangeSuccess\', function (event, toState, toParams, fromState, fromParams) {
        console.log(event);
        console.log(toState);
        console.log(toParams);
        console.log(fromState);
        console.log(fromParams);
        console.log($rootScope.tab);
        if (toState.name = \'home.list\') {
           
                $http({
                    url: "https://cnodejs.org/api/v1/topics",
                    method: \'GET\',
                    params: {
                        limit: 10,
                        page: 1,
                        tab: toParams.id
                    }
                }).then(function (res) {
                    // console.log(res.data);
                    if (res.data.success) {
                        $rootScope.news = res.data.data;
                        console.log($rootScope.news);
                    }
                })
            }
        }
    )
}])

  注入$rootScope服务,监听$stateChangeSuccess

  $rootScope.$on(\'$stateChangeSuccess\', function (event, toState, toParams, fromState, fromParams){//code}
  
  

  

    

 

请使用手机"扫一扫"x

以上是关于angularJs---route的主要内容,如果未能解决你的问题,请参考以下文章

AngularJs ng-route路由详解

AngularJs ng-route路由详解

Part 39 AngularJS route change events

angularJs ui-route

angularjs ui-route:仅更改 1 个嵌套视图并保存其他视图以防止重新加载

Angularjs UI-route 为啥无法跳转到 test.html