詳解AngularJS 路由 resolve用法
ng-route模塊中的when()和ui-route的state()都提供了resolve屬性。
為什么需要使用resolve?
當路由切換的時候,被路由的頁面中的元素(標簽)就會立馬顯示出來,同時,數據會被準備好并呈現出來。但是注意,數據和元素并不是同步的,在沒有任何設置的情況下,AngularJS默認先呈現出元素,而后再呈現出數據。這樣就會導致頁面會被渲染兩遍,導致“頁面UI抖動”的問題,對用戶不太友好。resolve的出現解決了這個問題。
resolve是干嘛用的
resolve屬性里的值會在路由成功前被預先設定好,然后注入到控制器中。通俗地將,就是等數據都“就位”后,才進行路由(其實我覺得也不能叫路由,因為路由是一些列的操作,其中就包括了設置resolve屬性等等)。這樣的好處就是頁面僅會被渲染一遍。
<!--首頁.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">點擊加載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方法里面設置了resolve屬性,里面的值是一個名為user的對象,它存有幾個值(格式好像JSON)。并把這個user變量注入到控制器中。這樣就完成了預加載了。
這種把resolve屬性的值(這里是user)注入到控制器的方式有一個非常強大的地方就是,可以運用他來重用控制器,而我們需要做的僅僅只是改變user對象里面的值(tips:如果是嵌套路由的話,不重新設置resolve值則會“繼承”父路由的resolve值,如果不是嵌套路由且不重新設置,則不會正確顯示)。
<!--list.html-->
<div>
<h1>HI,這里是list.html</h1>
<a ui-sref="index.list">點擊加載list.html視圖</a>
<a ui-sref="index.list2">點擊加載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;
});
這里省略了首頁的html,可以翻到最上面看。重點對比最后的兩個state(),可以發(fā)現第一個沒有重新設置resolve屬性,而第二個重新設置了resolve()屬性。他們雖然共用了同一個控制器myController ,但是他們的值卻不相同。
這樣,控制器的可維護性就會得到提高。
除此之外還可以借助$ocLazyLoad動態(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(){
//做些事情
});
}]
}
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
angular2/ionic2 實現搜索結果中的搜索關鍵字高亮的示例
這篇文章主要介紹了angular2/ionic2 實現搜索結果中的搜索關鍵字高亮的示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-08-08
ng2學習筆記之bootstrap中的component使用教程
現在angular2已經除了集成的angular-cli,建議大家可以基于這個來快速開發(fā)ng2的項目,不用自己再搭建環(huán)境。接下來通過本文給大家介紹 bootstrap中的component使用教程,需要的朋友可以參考下2017-03-03
解決angularjs前后端分離調用接口傳遞中文時中文亂碼的問題
今天小編就為大家分享一篇解決angularjs前后端分離調用接口傳遞中文時中文亂碼的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
Angular.js實現獲取驗證碼倒計時60秒按鈕的簡單方法
最近做項目的時候又遇到了驗證碼倒計時的需求,發(fā)現這個功能還是挺實用的,所以就想著總結一下,下面這篇文章主要給大家介紹了關于利用Angular.js如何實現獲取驗證碼倒計時按鈕的簡單方法,需要的朋友可以參考借鑒,下面來一起看看吧。2017-10-10

