10分钟学会AngularJS路由

AngularJS路由是一种映射,一种对应关系。

urlcontroller、template之间的对应关系。

还可以是url与路由名称、controller(控制器)template(模板)之间的对应关系。

浏览器传统的导航模式(模型)

1.在地址栏输入url,浏览器就会导航到相应的页面

2.在页面中单击链接,浏览器地址会发生改变,页面导航到另一个新页面

3.单击浏览器的前进和后退按钮,浏览器就会向前或向后导航到相应的页面

页面换为组件,就可看做是AngularJS的导航模型了。

可使用AngularJS官方提供的ngRoute模块$routeProvider服务配置路由,语法如下(举例说明):

//创建模块,加载ngRoute模块
let app = angular.module("book-app",['ngRoute'])
.config(['$routeProvider','$locationProvider',function($routeProvider,$locationProvider{


//配置路由,就是配置URL与模板、控制器之间的映射关系。    
$routeProvider.when('/',{
        controller:'ListController',
        templateUrl:'list.html'
    }).when('/add',{
        controller:'AddController',
        templateUrl:'add.html'
    }).when('/view/:id',{
        controller:'DetailController',
        templateUrl:'detail.html'
    }).when('/edit/:id',{
        controller:'EditController',
        templateUrl:'edit.html'
    }).otherwise({redirectTo:'/'});

    $locationProvider.html5Mode(true);//开启html5模式
})]);

为路由配置中的控制器提供函数。可通过调用angular.Modulecontroller方法实现。语法如下(举例说明):

app.controller("MainController",['$route','$location','ruoteParams',
    function($route,$location,$routeParams){
        this.$route=$route;
        this.$location=$location;
        this.$routeParams=$routeParams;
    }
]).controller("ListController",['$scope',
    function($scope){
        $scope.bookList = books;
    }
]).controller("AddController",['$scope',
    function($scope){
        $scope.add=function(){
            books.push($scope.book);
            $scope.book.id=books.length;
            //返回系统首页
            $location.path("/");
        }
    }
]).controller("DetailController",['$scope','$routeParams',
    function($scope,$routeParams){
        $scope.book=books[$routeParams.id-1];
    }
]).controller("EditController",['$scope','$routeParams','$location',
    function($scope,$routeParams,$location){
        $scope.book=books[$routeParams.id-1];
        $scope.rawBook = angular.copy($scope.book);
        $scope.save=function(){
            //如果有服务器端支持,此处应将修改提交到服务器
            //返回系统首页
            $location.path("/");
        }
        $scope.cancel=function(){
            books[$routeParams.id-1] = $scope.rawBook ;
            $location.path("/");
        }
    }
])

这些控制器负责为视图模板提供数据。

关于路由配置中的模板(不举例了),关键点:

1.控制器和视图模板所呈现的界面将会显示在指定了ng-view指令的HTML元素中。

2.在模板中使用的超链接(<a>),要指定hrefng-href属性。

也可使用第三方开源框架ui-router,需要下载安装并导入。

ui-router的提供两个路由配置服务:

1.$urlRouterProvider服务:URL重定向路由引擎,用法和$routeProvider比较相似,都是when和oherwise,实际上ui-router并不使用此服务配置路由。

2.$stateProvide服务:基础语法:state(name,stateConfig),举例说明:

let app = angular.module("book-app",['ui.router']).config(['$stateProvider','$urlRouterProvider',
    function($stateProvider,$urlRouterProvider){
        $urlRouterProvider.otherwise('/index');
        $stateProvider.state('index',{
                url:'/index',
                controller:'ListController',
                templateUrl:'list.html'
            }
        ).state('add',{    
                url:'/add',
                controller:'AddController',
                templateUrl:'add.html'
            }
        ).state('viewDetail',{
                url:'/view/:id',
                controller:'DetailController',
                templateUrl:'detail.html'
            }
        ).state('edit',{
                url:'/edit/:id',
                controller:'EditController',
                templateUrl:'edit.html'
            }
        )        
    }
])

控制器的函数中可以通过$state服务go("路由名称")方法激活相应路由。

控制器和模板呈现的界面显示在指定了ui-view属性的元素中。

一条路由,多个视图,根据ui-view="",显示相应的视图,举例说明:

<body ng-app="router-app">
    <h1>多视图</h1>
    <span ui-sref="home({userId:20})">主页</span>
    <span ui-sref="books">图书</span>
    <span ui-sref="authors">作者</span>
    <div ui-view=""></div>
    <div>
         <div ui-view="summary"></div>
         <div ui-view="content"></div>
    </div>
</body>   

上述代码中每一个"ui-sref"都对应一条路由,每条路由都有三个视图,名称分别为:"" 、"summary"、"content"

路由配置如下:

let app=angular.module("router-app",["ui.router"]).config(['$stateProvider','$urlRouterProvider',
    function($stateProvider,$urlRouterProvider){
        $urlRouterProvider.otherwise("/home/");
        $stateProvider.state("home",{
            url:"/home/:userId",
            views:{
                "":{
                    template:"<h3>多视图</h3>"
                },
                "summary":{
                    template:"首页部分的概要信息"    
                },
                "content":{
                    templateProvider:['$stateParams',function($stateParams){
                            return '函数动态生成的模板,现在的时间是:<p><b>' +
                               new Date() + '</b></p>'+'userId参数是:'+ 
                               $stateParams.userId
                        }
                    ]        
                }   
            }
        }).state("books",{
            url:"/books",
            views:{
                "":{
                    template:"<h3>多视图</h3>"
                },
                "summary":{
                    templateUrl:'summary.html',
                    controller:"summaryCtrl"
                },
                "content":{
                    templateUrl:'books.html',
                    controller:function($scope){
                        //数据处理
                    }
                }
            }
        }).state("athors",{
            views:{
                "":{
                
                },
                "summary":{
                
                },
                "content":{
                  
                }
            }
        })
    }
])

猜你喜欢

转载自blog.csdn.net/qq_40741855/article/details/88101216