您好,登錄后才能下訂單哦!
這篇文章主要介紹了AngularJs中ui-router路由的示例分析,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
ui-router
$urlRouterProvider
$urlRouterProvider負責監聽$location.當$location變化的時候,$urlRouterProvider開始在一個規則的列表中一個個的查找,直到找到匹配的值。$urlRouterProvider用于在后端指定url的狀態配置。所有的url被編譯成UrlMatcher對象。
依賴: $urlMatcherFactoryProvider $locationProvider
方法:
deferIntercept(defer);
禁用(或啟用)延遲location變化的攔截。如果你想定制與URL同步的行為(例如,你需要保持當前的URL去并且推遲一個變化),那么在配置的時候使用這個方法。
參數:
defer:boolean,確定是禁止還是啟用該攔截。
代碼:
angular.module('Demo',['ui.router']) .config(["$urlRouterProvider",function(){ $urlRouterProvider.deferIntercept(defer); // defer = true/false }])
這是源碼部分:
this.deferIntercept = function (defer) { if (defer === undefined) defer = true; interceptDeferred = defer; // 默認是true };
otherwise(rule);
定義一個當請求的路徑是無效路徑時跳轉的路徑。
rule:你想重定向的url路徑或一個返回的網址路徑的規則函數。函數傳入兩個參數:$injector和$location服務,而且必須返回一個string的url。
代碼:
angular.module('Demo',['ui.router']) .config(["$urlRouterProvider",function(){ $urlRouterProvider.otherwise(rule); // rule = 重定向的url規則 }])
rule(rule);
定義使用$urlRouterProvider 來匹配指定的URL的規則。
參數:
rule:將$injector和$location作為arguments傳入的處理函數。用來返回一個string類型的url路徑。
代碼:
angular.module('Demo',['ui.router']) .config(["$urlRouterProvider",function($urlRouterProvider){ $urlRouterProvider.rule(function ($injector, $location) { var path = $location.path(), normalized = path.toLowerCase(); if (path !== normalized) { return normalized; } }); }])
when(what,handler);
為給定的URL匹配注冊一個處理程序。
參數:
what:需要重定向的傳入路徑。
handler:你想要重定向的路徑/處理程序。
代碼:
angular.module('Demo', ['ui.router']); .config(["$urlRouterProvider",function ($urlRouterProvider) { $urlRouterProvider.when($state.url, function ($match, $stateParams) { if ($state.$current.navigable !== state || !equalForKeys($match, $stateParams) { $state.transitionTo(state, $match, false); } }); }]);
$urlRouter
依賴:$location $rootScope $injector $browser
方法:href(urlMacther,params,options);
一個生成URL的方法,為給定的UrlMatcher返回編譯后的URL,并且用提供的參數填充。
參數:
urlMacther:用于當作生成URL的模板的UrlMacther對象。
params:一個參數值的對象用來填補所需的匹配參數。
options:option對象,absolute-boolean,如果為true,將會生成一個絕對地址。
代碼:
$bob = $urlRouter.href(new UrlMatcher("/about/:person"), { person: "bob" }); // $bob == "/about/bob"; sync();
sync();
觸發更新:發生在地址欄URL變化時執行相同的更新。
$state
$state服務負責代表狀態及提供狀態之間的轉換。它還提供你當前的狀態及上一個狀態。
依賴:$rootScope $q $view $injector $resolve $stateParams $urlRouter
方法:get(stateOrName,context);
返回任何指定的狀態或所有狀態的配置對象。
參數:
stateOrName:如果提供此參數,返回的是指定狀態的配置對象;如果不提供此參數,則返回全部狀態的配置對象。
context:當context是一個相對的參考狀態,狀態會在相關上下文中檢索。
方法:
go(to,params,options);
參數:
to:string,即將跳轉的狀態。
params:object,跳轉所帶的參數。
options:object,可選配置對象。有 location(是否更新地址欄的url,或以什么字符串替換url),inherit(是否繼承當前url的參數),relative(當變化相對路徑:如"^,定義的狀態是相對的),notify(是否廣播$stateChangeStart和$stateChangeSuccess事件),reload(是否重新載入)。
代碼:
$state.go('contact.detail');
href(stateOeName,params,options);
一個URL生成方法,返回為給定的狀態填充指定的參數編譯后的鏈接。
參數:
stateOeName:string,你想要生成的url的狀態或者狀態對象。
params:object,一個用于填充狀態需要的參數的對象。
options:可選配置對象。有lossy(當第一個參數url未被提供時是否繼承導航的url進行構建href),inherit(是否繼承當前url的參數),relative(當變化相對路徑:如"^,定義的狀態是相對的),absolute(是否生成絕對url)。
代碼:
$state.href("about.person", { person: "bob" })
include(stateOrName,params,options);
一個確定當前有效的狀態是不是與stateOrName平級的還是其子狀態。
參數:
stateOeName:string,部分名稱,相對名稱,或者通過當前狀態進行全局模式查找。
params:object,一個參數對象。
options:可選配置對象。有relative。
代碼:
<div ng-class="{highlighted:$state.includes('.item')}">Item</div>
$state.$current.name = 'contacts.details.item'; $state.includes("contacts"); // true $state.includes("contacts.details"); // true $state.includes("contacts.details.item"); // true $state.includes("contacts.list"); // false $state.includes("about"); // false
全局模式:
$state.$current.name = 'contacts.details.item.url'; $state.includes("*.details.*.*"); // true $state.includes("*.details.**"); // true $state.includes("**.item.**"); // true $state.includes("*.details.item.url"); // true $state.includes("*.details.*.url"); // true $state.includes("*.details.*"); // false $state.includes("item.**"); // false
is(stateOrName,params,options);
與$state.include相似,只是這個針對的是全名。參數性質同上。
代碼:
<div ng-class="{highlighted: $state.is('.item')}">Item</div>
$state.$current.name = 'contacts.details.item'; $state.is('contact.details.item'); // true $state.is(contactDetailItemStateObject); // true
reload(state);
重新載入當前狀態的方法。
參數:
state:一個狀態名稱或者狀態對象。
代碼:
$state.reload('contact.detail');
transitionTo(to,toParams,options);
過渡到一個新狀態的方法。
參數:
to:狀態名稱。
toParams:將會發送到下一個狀態的參數。
options:可選參數。有location,inherit,relative,notify,reload。
代碼:
$state.transitionTo($state.current, $stateParams, { reload: true, inherit: false, notify: true });
事件:
1 、$stateChangeError
路由狀態變化發生錯誤時觸發的事件。參數有:event,toState,toParams,fromState,fromParams,error。以上根據字面意思即可理解,哈哈。
2、$stateChangeStart
路由狀態變化發生前觸發的事件。參數有:event,toState,toParams,fromState,fromParams。
3、$stateChangeSuccess
路由狀態變化正確時觸發的事件。參數有:event,toState,toParams,fromState,fromParams。
4、$stateNotFound
路由狀態沒找到的時候觸發的事件。參數有:event,unfoundState,fromState,fromParams。
$stateProvider
處理路由狀態的服務,路由的狀態反映了該項在應用程序中的位置,描述了在當前狀態下UI是應該怎么樣的,并且該做什么。
依賴:$urlRouterProvider $urlMatcherFactoryProvider
方法:
decorator(name,func);
通過內部的$stateProvider以擴展或者重寫狀態生成器。可用于添加ui-router的自定義功能,例如,基于狀態名稱推斷templateUrl。
警告:因為生成器的函數執行順序的不確定,decorator不應該相互依賴。
參數:
name:需要修改的生成函數名稱。
func:負責修改生成器函數的函數。
代碼:
$stateProvider.decorator('views', function (state, parent) { var result = {}, views = parent(state); angular.forEach(views, function (config, name) { var autoName = (state.name + '.' + name).replace('.', '/'); config.templateUrl = config.templateUrl || '/partials/' + autoName + '.html'; result[name] = config; }); return result; }); $stateProvider.state('home', { views: { 'contact.list': { controller: 'ListController' }, 'contact.item': { controller: 'ItemController' } } }); $state.go('home');
以上代碼修飾了“views”直接通過state的名稱綁定完對應的頁面模板。
state(name,stateConfig);
注冊一個狀態,并給定其配置。
參數:
name:狀態的名稱。
stateConfig:狀態配置對象。配置具有以下各項屬性:
template: string/function,html模板字符串,或者一個返回html模板字符串的函數。
templateUrl:string/function,模板路徑的字符串,或者返回模板路徑字符串的函數。
templateProvider:function,返回html模板字符串或模板路徑的服務。
controller:string/function,新注冊一個控制器函數或者一個已注冊的控制器的名稱字符串。
controllerProvider:function,返回控制器或者控制器名稱的服務
controllerAs:string,控制器別名。
parent:string/object,手動指定該狀態的父級。
resolve:object,將會被注入controller去執行的函數,<string,function>形式。
url:string,當前狀態的對應url。
views:object,視圖展示的配置。<string,object>形式。
abstract:boolean,一個永遠不會被激活的抽象的狀態,但可以給其子級提供特性的繼承。默認是true。
onEnter:function,當進入一個狀態后的回調函數。
onExit:function,當退出一個狀態后的回調函數。
reloadOnSearch:boolean,如果為false,那么當一個search/query參數改變時不會觸發相同的狀態,用于當你修改$location.search()的時候不想重新加載頁面。默認為true。
data:object,任意對象數據,用于自定義配置。繼承父級狀態的data屬性。換句話說,通過原型繼承可以達到添加一個data數據從而整個樹結構都能獲取到。
params:url里的參數值,通過它可以實現頁面間的參數傳遞。
ui-sref
一種將鏈接(<a>標簽)綁定到一個狀態的指令。點擊該鏈接將觸發一個可以帶有可選參數的狀態轉換。
代碼:
<a ui-sref="app.index">首頁</a> <!-- 這里是正常的跳轉 --> <a ui-sref="app.index({id:yourId})">你的主頁</a> <!-- 這里是帶參數對象的跳轉,名稱是id,值是yourId -->
簡單的使用代碼(ui-router的單視圖):
<div ng-app="Demo" ng-controller="testCtrl as ctrl"> <ol> <li><a ui-sref="app">app</a></li> <li><a ui-sref="test">test</a></li> </ol> <div ui-view></div> <script type="text/ng-template" id="'page1.html'"> this is page 1 for app. </script> <script type="text/ng-template" id="'page3.html'"> this is page 1 for test. </script> </div>
angular.module('Demo', ['ui.router']) .config(["$stateProvider","$urlRouterProvider",routeConfig]) .controller("testCtrl", angular.noop) function routeConfig($stateProvider,$urlRouterProvider){ $urlRouterProvider.otherwise("/app"); $stateProvider .state("app",{ url:"/app", templateUrl:"'page1.html'" }) .state("test",{ url:"/test", templateUrl:"'page3.html'" }) }
使用代碼(ui-router的多視圖):
<div ng-app="Demo" ng-controller="testCtrl as ctrl"> <ol> <li><a ui-sref="app.page1">app</a></li> <li><a ui-sref="test.page1({id:1})">test</a></li> </ol> <div ui-view></div> <script type="text/ng-template" id="'layout.html'"> <div ui-view="nav@"></div> <div ui-view></div> </script> <script type="text/ng-template" id="'nav1.html'"> <ol> <li><a ui-sref="app.page1">app.page1</a></li> <li><a ui-sref="app.page2">app.page2</a></li </ol> </script> <script type="text/ng-template" id="'nav2.html'"> <ol> <li><a ui-sref="test.page1({id:1})">test.page1</a></li> <li><a ui-sref="test.page2">test.page2</a></li </ol> </script> <script type="text/ng-template" id="'page1.html'"> this is page 1 for app. </script> <script type="text/ng-template" id="'page2.html'"> this is page 2 for app. </script> <script type="text/ng-template" id="'page3.html'"> this is page 1 for test. </script> <script type="text/ng-template" id="'page4.html'"> this is page 2 for test. </script> </div>
angular.module('Demo', ['ui.router']) .config(["$stateProvider","$urlRouterProvider",routeConfig]) .controller("testCtrl", angular.noop) function routeConfig($stateProvider,$urlRouterProvider){ $urlRouterProvider.otherwise("/app/page1"); $stateProvider .state("app",{ url:"/app", views:{ "":{ templateUrl:"'layout.html'" }, "nav":{ templateUrl:"'nav1.html'" } } }) .state("app.page1",{ url:"/page1", templateUrl:"'page1.html'" }) .state("app.page2",{ url:"/page2", templateUrl:"'page2.html'" }) .state("test",{ url:"/test", views:{ "":{ templateUrl:"'layout.html'" }, "nav":{ templateUrl:"'nav2.html'" } } }) .state("test.page1",{ url:"/page1?:id", templateUrl:"'page3.html'", controller:["$stateParams",function($stateParams){ console.log($stateParams.id);// 1 這里實現傳參 }], params:{ id:null } }) .state("test.page2",{ url:"/page2", templateUrl:"'page4.html'" }) }
注意:需要引入angular-ui-router[.min].js
感謝你能夠認真閱讀完這篇文章,希望小編分享的“AngularJs中ui-router路由的示例分析”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。