詳解AngularJS 路由 resolve用法
ng-route模塊中的when()和ui-route的state()都提供了resolve屬性。
為什么需要使用resolve?
當(dāng)路由切換的時(shí)候,被路由的頁(yè)面中的元素(標(biāo)簽)就會(huì)立馬顯示出來,同時(shí),數(shù)據(jù)會(huì)被準(zhǔn)備好并呈現(xiàn)出來。但是注意,數(shù)據(jù)和元素并不是同步的,在沒有任何設(shè)置的情況下,AngularJS默認(rèn)先呈現(xiàn)出元素,而后再呈現(xiàn)出數(shù)據(jù)。這樣就會(huì)導(dǎo)致頁(yè)面會(huì)被渲染兩遍,導(dǎo)致“頁(yè)面UI抖動(dòng)”的問題,對(duì)用戶不太友好。resolve的出現(xiàn)解決了這個(gè)問題。
resolve是干嘛用的
resolve屬性里的值會(huì)在路由成功前被預(yù)先設(shè)定好,然后注入到控制器中。通俗地將,就是等數(shù)據(jù)都“就位”后,才進(jìn)行路由(其實(shí)我覺得也不能叫路由,因?yàn)槁酚墒且恍┝械牟僮?,其中就包括了設(shè)置resolve屬性等等)。這樣的好處就是頁(yè)面僅會(huì)被渲染一遍。
<!--首頁(yè).html--> <div ng-app="myApp"> <div><a ui-sref = "index">前往list.html</a></div> <div ui-view></div><!--這里是路由視圖存放的地方--> </div>
<!--list.html>
<div>
<h1>HI,這里是list.html</h1>
<a ui-sref="index.list">點(diǎn)擊加載list.html視圖</a>
<div ui-view></div>
<h1>{{user}}</h1>
<h2>{{name}}</h2>
<h3>{{age}}</h3>
<h3>{{email}}</h3>
</div>
//JS
var app = angular.module('myApp',['ui.router']);
app.config(["$stateProvider",function($stateProvider){
$stateProvider
.state("index",{
url:'/',
templateUrl:'list.html',
controller:'myController',
resolve:{
user:function(){
return {
name:"perter",
email:"826415551@qq.com",
age:"18"
}
}
}
})
}]);
app.controller('myController',function($scope,user){
$scope.name=user.name;
$scope.age=user.age;
$scope.email=user.email;
$scope.user=user;
});
我在state方法里面設(shè)置了resolve屬性,里面的值是一個(gè)名為user的對(duì)象,它存有幾個(gè)值(格式好像JSON)。并把這個(gè)user變量注入到控制器中。這樣就完成了預(yù)加載了。
這種把resolve屬性的值(這里是user)注入到控制器的方式有一個(gè)非常強(qiáng)大的地方就是,可以運(yùn)用他來重用控制器,而我們需要做的僅僅只是改變user對(duì)象里面的值(tips:如果是嵌套路由的話,不重新設(shè)置resolve值則會(huì)“繼承”父路由的resolve值,如果不是嵌套路由且不重新設(shè)置,則不會(huì)正確顯示)。
<!--list.html-->
<div>
<h1>HI,這里是list.html</h1>
<a ui-sref="index.list">點(diǎn)擊加載list.html視圖</a>
<a ui-sref="index.list2">點(diǎn)擊加載list2.html視圖</a>
<div ui-view></div>
<h1>{{user}}</h1>
<h2>{{name}}</h2>
<h3>{{age}}</h3>
<h3>{{email}}</h3>
</div>
//js
var app = angular.module('myApp',['ui.router']);
app.config(["$stateProvider",function($stateProvider){
$stateProvider
.state("index",{
url:'/',
templateUrl:'list.html',
controller:'myController',
resolve:{
user:function(){
return {
name:"perter",
email:"826415551@qq.com",
age:"18"
}
}
}
})
.state("index.list",{
url:'/list',
template:'<h1>{{name}}</h1>',
controller:'myController',
})
.state("index.list2",{
url:'/list2',
template:'<h1>{{name}}</h1>',
controller:'myController',
resolve:{
user:function () {
return{
name:"Rose"
}
}
}
})
}]);
app.controller('myController',function($scope,user){
$scope.name=user.name;
$scope.age=user.age;
$scope.email=user.email;
$scope.user=user;
});
這里省略了首頁(yè)的html,可以翻到最上面看。重點(diǎn)對(duì)比最后的兩個(gè)state(),可以發(fā)現(xiàn)第一個(gè)沒有重新設(shè)置resolve屬性,而第二個(gè)重新設(shè)置了resolve()屬性。他們雖然共用了同一個(gè)控制器myController ,但是他們的值卻不相同。
這樣,控制器的可維護(hù)性就會(huì)得到提高。
除此之外還可以借助$ocLazyLoad動(dòng)態(tài)加載js、css,用法如下:
resolve: {
deps: ['$ocLazyLoad', function($ocLazyLoad) {
return $ocLazyLoad.load({
name: 'App',
insertBefore: '#ng_load_plugins_before',
files: [
'xx/js/controllers/xx.js'
]
});
}],
showImgFiles: ['$ocLazyLoad', function($ocLazyLoad) {
return $ocLazyLoad.load([{
name: 'App',
insertBefore: '#ng_load_plugins_before',
files: [
'xx/xx/xx.css',
'xx/xx/xx.js'
]
}]).then(function(){
//做些事情
});
}]
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
angular2/ionic2 實(shí)現(xiàn)搜索結(jié)果中的搜索關(guān)鍵字高亮的示例
這篇文章主要介紹了angular2/ionic2 實(shí)現(xiàn)搜索結(jié)果中的搜索關(guān)鍵字高亮的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
ng2學(xué)習(xí)筆記之bootstrap中的component使用教程
現(xiàn)在angular2已經(jīng)除了集成的angular-cli,建議大家可以基于這個(gè)來快速開發(fā)ng2的項(xiàng)目,不用自己再搭建環(huán)境。接下來通過本文給大家介紹 bootstrap中的component使用教程,需要的朋友可以參考下2017-03-03
Angularjs實(shí)現(xiàn)多圖片上傳預(yù)覽功能
這篇文章主要介紹了Angularjs實(shí)現(xiàn)多圖片上傳預(yù)覽功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07
Angular 2.x學(xué)習(xí)教程之結(jié)構(gòu)指令詳解
結(jié)構(gòu)指令通過添加和刪除 DOM 元素來更改 DOM 布局。Angular 中兩個(gè)常見的結(jié)構(gòu)指令是 *ngIf 和 *ngFor,下面這篇文章主要給大家介紹了關(guān)于Angular 2.x結(jié)構(gòu)指令的相關(guān)資料,需要的朋友可以參考下。2017-05-05
深入理解Angularjs向指令傳遞數(shù)據(jù)雙向綁定機(jī)制
這篇文章主要深入的給大家介紹了Angularjs向指令傳遞數(shù)據(jù),雙向綁定機(jī)制的相關(guān)資料,需要的朋友可以參考下2016-12-12
解決angularjs前后端分離調(diào)用接口傳遞中文時(shí)中文亂碼的問題
今天小編就為大家分享一篇解決angularjs前后端分離調(diào)用接口傳遞中文時(shí)中文亂碼的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08
詳解基于angular-cli配置代理解決跨域請(qǐng)求問題
本篇文章主要介紹了詳解基于angular-cli配置代理解決跨域請(qǐng)求問題,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
Angular.js實(shí)現(xiàn)獲取驗(yàn)證碼倒計(jì)時(shí)60秒按鈕的簡(jiǎn)單方法
最近做項(xiàng)目的時(shí)候又遇到了驗(yàn)證碼倒計(jì)時(shí)的需求,發(fā)現(xiàn)這個(gè)功能還是挺實(shí)用的,所以就想著總結(jié)一下,下面這篇文章主要給大家介紹了關(guān)于利用Angular.js如何實(shí)現(xiàn)獲取驗(yàn)證碼倒計(jì)時(shí)按鈕的簡(jiǎn)單方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10
angular學(xué)習(xí)之ngRoute路由機(jī)制
這篇文章主要介紹了angular學(xué)習(xí)之ngRoute路由機(jī)制,ngRoute是一個(gè)Module,提供路由和深層鏈接所需的服務(wù)和指令。有需要的可以了解一下。2017-04-04

