本篇文章翻译自:https://scotch.io/tutorials/angular-routing-using-ui-routercss
演示网站请查看:http://embed.plnkr.co/IzimSVsstarlFviAm7S7/previewhtml
源码:http://plnkr.co/edit/IzimSVsstarlFviAm7S7?p=previewgit
下面是我本身作的demo。比上面的例子要简单一点。angularjs
github DEMO地址以下:https://github.com/roverliang/UI-Router-DEMOgithub
受本人英语水平限制,因此只能简要翻译,英语水平比较好的能够直接查看原文。ajax
AngularJs的指令集是一个很是好的方式用来构建单页的网页应用。当建立一个单页应用的时候,路由的重要性就凸显出来。咱们但愿咱们的导航栏就如同普通的网站同样,点击后没有刷新,那么咱们可使用Angular的路由——ngRouter 方法。bootstrap
可是,如今咱们将注意力放在另一个好用的方法上——UI-Router.app
UI-Router 是Angular 团队建立的一个路由框架。他的指令和Angular的ngRoute方法很接近。它经过改变应用中视图的状态(State),而不是像ngRoute那样经过改变当前应用的url来实现。框架
使用这种方法,你的视图和路由不是绑定在一块儿的。你能够改变你的站点的某些部分,而你的url而不用也跟着变化。当使用ngRoute,你必须使用nginclude或者其余的方法,这可能会致使混淆。如今你全部的状态(state)、路由(route)以及视图(view)
你将所有接管,使用config()方法,这将建立一个自上而下(等会解释)的应用。dom
下面让咱们作一个UI-Route的教程。这将建立一个Home和About页面。
让咱们开始书写咱们的应用,咱们须要一些文件。
- index.html // will hold the main template for our app - app.js // our angular code - partial-about.html // about page code - partial-home.html // home page code - partial-home-list.html // injected into the home page - table-data.html // re-usable table that we can place anywhere
咱们的应用框架已经搭建完毕,那就让咱们按照框架的结构填充代码吧。
<!-- index.html --> <!DOCTYPE html> <html> <head> <!-- CSS (load bootstrap) --> <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css"> <style> .navbar { border-radius:0; } </style> <!-- JS (load angular, ui-router, and our custom js file) --> <script src="http://code.angularjs.org/1.2.13/angular.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.8/angular-ui-router.min.js"></script> <script src="app.js"></script> </head> <!-- apply our angular app to our site --> <body ng-app="routerApp"> <!-- NAVIGATION --> <nav class="navbar navbar-inverse" role="navigation"> <div class="navbar-header"> <a class="navbar-brand" ui-sref="#">AngularUI Router</a> </div> <ul class="nav navbar-nav"> <li><a ui-sref="home">Home</a></li> <li><a ui-sref="about">About</a></li> </ul> </nav> <!-- MAIN CONTENT --> <div class="container"> <!-- THIS IS WHERE WE WILL INJECT OUR CONTENT ============================== --> <div ui-view></div> </div> </body> </html>
上面事咱们首页的html文件,咱们将引用BootStrap来傍午咱们构建样式。值得注意的是必须在引用AngularJS以后引用ui-router。UI Router是AngularJS的核心组成部分,就像ngRoute同样。
当咱们使用UI-Router建立一个连接的时候,你将会使用ui-sref。 这些在你的app.js将状态会转化成一个连接。
同理咱们将使用
来 代替 ngRoute 的让咱们继续构建咱们的app.js吧。
// app.js var routerApp = angular.module('routerApp', ['ui.router']); routerApp.config(function($stateProvider, $urlRouterProvider) { $urlRouterProvider.otherwise('/home'); $stateProvider // HOME STATES AND NESTED VIEWS ======================================== .state('home', { url: '/home', templateUrl: 'partial-home.html' }) // ABOUT PAGE AND MULTIPLE NAMED VIEWS ================================= .state('about', { // we'll get to this in a bit }); });
咱们已经建立了咱们的RouteAPP。咱们将body放置在index.html中,在这个页面中,咱们有一个home选项和about选项。咱们将使用partial-home.html做为模板文件。 让咱们在partial-home.html中填充些代码吧。
<!-- partial-home.html --> <div class="jumbotron text-center"> <h1>The Homey Page</h1> <p>This page demonstrates <span class="text-danger">nested</span> views.</p> </div>
截止如今咱们已经拥有了咱们的站点,虽然咱们尚未敲多少代码,可是咱们的确拥有了它。
上面一些无聊的构建文件的阶段已通过去,下面让咱们看下为何UI-Router会产生那么酷炫的效果。
接下来看看如何构建咱们的应用。首先咱们将在首页添加两个button。其次将根据用户点击不一样的button切换不一样的页面。
咱们将两个button添加到partial-home.html ,而后思考如何才能进行页面切换。
<!-- partial-home.html --> <div class="jumbotron text-center"> <h1>The Homey Page</h1> <p>This page demonstrates <span class="text-danger">nested</span> views.</p> <a ui-sref=".list" class="btn btn-primary">List</a> <a ui-sref=".paragraph" class="btn btn-danger">Paragraph</a> </div> <div ui-view></div>
当咱们连接到一个嵌套视图。咱们将使用点(dot):ui-sref=".list"和ui-sref=".paragraph"。咱们将在这个文件中定义他们,定义后会被注入(inject)到咱们的新的视图区
如今切换到咱们app.js,让咱们建立剩下的嵌套状态(states)
// app.js ... $stateProvider // HOME STATES AND NESTED VIEWS ======================================== .state('home', { url: '/home', templateUrl: 'partial-home.html' }) // nested list with custom controller .state('home.list', { url: '/list', templateUrl: 'partial-home-list.html', controller: function($scope) { $scope.dogs = ['Bernese', 'Husky', 'Goldendoodle']; } }) // nested list with just some random string data .state('home.paragraph', { url: '/paragraph', template: 'I could sure use a drink right now.' }) ...
如今 ui-sref 被定义在home.html中,标注一个状态。随着home.list和home.paragraph页面建立。这些连接所对应的模板将会被注册到ui-view中。
咱们最后一件事要作的是partial-home-list.html文件定义。此外还建立了一个控制器,咱们将在模板中使用这些数据(dogs对象)。
<!-- partial-home-list.html --> <ul> <li ng-repeat="dog in dogs">{{ dog }}</li> </ul>
如今咱们列表,它会将数据(dogs对象)注入到模板。若是咱们点击Paragraph,它会将字符串注入页面中。
如今你应该发现了在咱们的状态上切换不一样的部分是多么的简单。咱们并无使用ngInclude、ngShow,ngHide。或者ngIf。这保持咱们的app.js是足够的简单。
一个有多个视图的应用程序会更增强大。也许你的网站上还有侧边栏,上面有热门职位、最近的帖子、用户什么之类的。这些均可以被分离出来,而且注入咱们的模板。而且能够为每个模板使用是一个控制器,这将充分保持咱们应用程序的干净。
对于咱们的About页,让咱们作一个双栏,并有各自的数据。咱们将先处理视图,而后再看看咱们如何使用用户界面的路由器。
<!-- partial-about.html --> <div class="jumbotron text-center"> <h1>The About Page</h1> <p>This page demonstrates <span class="text-danger">multiple</span> and <span class="text-danger">named</span> views.</p> </div> <div class="row"> <!-- COLUMN ONE NAMED VIEW --> <div class="col-sm-6"> <div ui-view="columnOne"></div> </div> <!-- COLUMN TWO NAMED VIEW --> <div class="col-sm-6"> <div ui-view="columnTwo"></div> </div> </div>
这里会有更多的页面,一个是columnOne,一个是columnTwo.
为何有人会使用这种方法?这是一个很好的问题。是咱们建立一个应用程序太模块化,这可能会让人困惑?从官方的UI路由器文档,这里是一个坚实的例子,为何你会有多个命名视图。在他们的例子中,他们展现了一个应用程序的不一样部分。每一部分都有本身的数据,因此每一部分都有本身的控制器和模板文件,使得构建相似这样的东西很容易。
如今咱们全部的视图已经建立完毕,让咱们回到app.js
// app.js ... .state('about', { url: '/about', views: { // the main template will be placed here (relatively named) '': { templateUrl: 'partial-about.html' }, // the child views will be defined here (absolutely named) 'columnOne@about': { template: 'Look I am a column!' }, // for column two, we'll define a separate controller 'columnTwo@about': { templateUrl: 'table-data.html', controller: 'scotchController' } } }); }); // closes $routerApp.config() // let's define the scotch controller that we call up in the about state routerApp.controller('scotchController', function($scope) { $scope.message = 'test'; $scope.scotches = [ { name: 'Macallan 12', price: 50 }, { name: 'Chivas Regal Royal Salute', price: 10000 }, { name: 'Glenfiddich 1937', price: 20000 } ]; }); ...
整个流程就是这样。完整的文章请查看https://scotch.io/tutorials/angular-routing-using-ui-router#sample-application
演示网站请查看:http://embed.plnkr.co/IzimSVsstarlFviAm7S7/preview
源码:http://plnkr.co/edit/IzimSVsstarlFviAm7S7?p=preview
。
下面是我本身作的demo。比上面的例子要简单一点。
github DEMO地址以下:https://github.com/roverliang/UI-Router-DEMO
应用目录以下。