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.htmlh1> 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 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|