前端之家收集整理的这篇文章主要介绍了
AngularJS 路由 resolve用法,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
ng-route模块中的when()
和ui-route的state()
都提供了resolve属性。
为什么需要使用resolve?
当路由切换的时候,被路由的页面中的元素(标签)就会立马显示出来,同时,数据会被准备好并呈现出来。但是注意,数据和元素并不是同步的,在没有任何设置的情况下,AngularJS默认先呈现出元素,而后再呈现出数据。这样就会导致页面会被渲染两遍,导致“页面UI抖动”的问题,对用户不太友好。resolve的出现解决了这个问题。
resolve是干嘛用的
resolve属性里的值会在路由成功前被预先设定好,然后注入到控制器中。通俗地将,就是等数据都“就位”后,才进行路由(其实我觉得也不能叫路由,因为路由是一些列的操作,其中就包括了设置resolve属性等等)。这样的好处就是页面仅会被渲染一遍。
<div ng-app="myApp">
div>
a ui-sref = "
index">前往list.html
</a>div>
ui-view>
div>
div>
1
2
3
4
5
6
7
8
9
10
<!
<
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>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
var app = angular.module(
'myApp',[
'ui.router']);
app.config([
"$stateProvider",
function($stateProvider){
$stateProvider
.state(
"index",{
url:
'/',templateUrl:
'list.html',controller:
'myController',resolve:{
user:
(){
return {
name:
"perter",email:
"826415551@qq.com",age:
"18"
}
}
}
})
}]);
app.controller(
($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值,如果不是嵌套路由且不重新设置,则不会正确显示)。
1
2
3
4
5
6
7
8
9
10
11
div> h1>HI,这里是list.html
h1>
ui-sref=
"index.list">点击加载list.html视图
a>
"index.list2">点击加载list2.html视图
h1>
{{user}}h2>{{name}}h2> h3>
{{age}}h3> email}}
div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
"18"
}
}
}
})
.state(
"index.list",0);
Box-sizing: border-
Box;">'/list',template:
'<h1>{{name}}</h1>',})
.state(
"index.list2",0);
Box-sizing: border-
Box;">'/list2',136);
Box-sizing: border-
Box;">function
() {
return{
name:
"Rose"
}
}
}
})
}]);
app.controller(
这里省略了首页的html,可以翻到最上面看。重点对比最后的两个state(),可以发现第一个没有重新设置resolve属性,而第二个重新设置了resolve()属性。他们虽然共用了同一个控制器myController
,但是他们的值却不相同。
这样,控制器的可维护性就会得到提高。
除此之外还可以借助$ocLazyLoad动态加载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',files: [
'xx/xx/xx.css','xx/xx/xx.js'
]
}]).then(function(){
//做些事情
});
}]
}
有一篇大神写的关于路由的文章,写的很详细,大家可以参考:
http://www.cnblogs.com/lovesueee/p/4442509.html