AngularJS进阶(一)深入理解ANGULARUI路由_UI-ROUTER_angularjs ui-router

最后

文章到这里就结束了,如果觉得对你有帮助可以点个赞哦

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

.config(function( s t a t e P r o v i d e r ,   stateProvider,  stateProvider, urlRouterProvider) {

$stateProvider

.state(‘start’, {

url: ‘/start’,

templateUrl: ‘partials/start.html’

})

});


上述代码在设置对象上定义了一个叫start的状态。设置对象stateConfig和路由设置对象的选项是非常相似的。


### 三、模板,模板路径,模板Provider


开发者可以在每个视图下使用如下方式来设置模板 - template - HTML字符串,或者是返回HTML字符串的函数 - templateUrl - HTML模板的路径,或者是返回HTML模板路径的函数 - templateProvider - 返回HTML字符串的函数 例如:



$stateProvider.state(‘home’, {

template: ‘

Hello {{ name }}

});


### 四、控制器


和ngRoute相似,开发者可以指定任何已经被注册的控制器,或者在路由里面创建一个作为控制器的函数。但如果没有定义模板,控制器将无效。


### 五、预载入Resolve


使用预载入功能,开发者可以预先载入一系列依赖或者数据,然后注入到控制器中。在ngRoute中resolve选项可以允许开发者在路由到达前载入数据保证(promises)。在使用这个选项时比使用angular-route有更大的自由度。



预载入选项需要一个对象,这个对象的key即要注入到控制器的依赖,这个对象的value为需要被载入的factory服务。



如果传入的是字符串,angular-route会试图匹配已经注册的服务。如果传入的是函数,该函数将会被注入,并且该函数返回的值便是控制器的依赖之一。如果该函数返回一个数据保证(promise),这个数据保证将在控制器被实例化前被预先载入并且数据会被注入到控制器中。



$stateProvider.state(‘home’, {

resolve: {

//这个函数的值会被直接返回,因为它不是数据保证

person: function() {

return {

name: “Ari”,

email: “ari@fullstack.io”

}

},

//这个函数为数据保证, 因此它将在控制器被实例化之前载入。

currentDetails: function($http) {

return $http({

method: ‘JSONP’,

url: ‘/current_details’

});

},

//前一个数据保证也可作为依赖注入到其他数据保证中!(这个非常实用)

facebookId: function($http, currentDetails) {

$http({

method: ‘GET’,

url: ‘http://facebook.com/api/current_user’,

params: {

email: currentDetails.data.emails[0]

}

})

}

},

//定义控制器

controller: function($scope, person, currentDetails, facebookId) {

$scope.person = person;

}

})


### 六、URL


url选项将会为该应用的状态指定一个URL基于用户浏览该应用所在的状态。这样当在浏览该应用的时候便能实现深度链接的效果。 该选项与ngRoute的URL相似,但可以被视为对ngRoute主要的升级,在接下来的文章里你便会认可这一点。开发者可以这样指定一个基本的路由。



$stateProvider

.state(‘inbox’, {

url: ‘/inbox’,

template: ‘

Welcome to your inbox

});


      当用户浏览到/inbox时,该应用将状态改为inbox同时向主ui-view元素中插入模板中的内容('Welcome to your inbox')。URL参数有多个选项,因此它非常强大。开发者可以像设置ngRoute一样设置最基本的参数:



$stateProvider

.state(‘inbox’, {

url: ‘/inbox/:inboxId’,

template: ‘

Welcome to your inbox

’,

controller: function( s c o p e ,   scope,  scope, stateParams) {

s c o p e . i n b o x I d   =   scope.inboxId =  scope.inboxId = stateParams.inboxId;

}

});


      现在将:inboxId作为URL的第二个部分,例如:访问/inbox/1,那么$stateParams.inboxId就为1($stateParams为{inboxId:1})。同时也可使用不同的语法:url: '/inbox/{inboxId}'


     


路径必须匹配URL,与ngRoute不同的是,当用户访问到/inbox/时,上面的的路径会被激活,然而当访问到/inbox时不会被激活。路径同时也使开发者可以使用正则表达式来匹配,例如:



// 限定id为6位16进制数字

url: ‘/inbox/{inboxId:[0-9a-fA-F]{6}}’,

// 或者

// 匹配任何在 /inbox后面的url(慎用)并匹配值到indexId

url: ‘/inbox/{inboxId:.*}’


      注意,在路由中目前还无法使用路由组,路由数据预载入器无法预载入。


     


在路径里可以指定查询参数:



// /inbox?sort=ascending 将会被匹配

url: ‘/inbox?sort’


### 七、嵌套路由


使用url参数可以实现嵌套的路由,有了嵌套路由便可在同一个模板同一个路由实现多层次的ui-view,例如在/inbox中嵌入更多路由:



$stateProvider

.state(‘inbox’, {

url: ‘/inbox/:inboxId’,

template: '

Welcome to your inbox

\

Show priority\

\

',

controller: function( s c o p e ,   scope,  scope, stateParams) {

s c o p e . i n b o x I d   =   scope.inboxId =  scope.inboxId = stateParams.inboxId;

}

})

.state(‘inbox.priority’, {

url: ‘/priority’,

template: ‘

Your priority inbox

});


      第一个路由是传统的,注意第二个,它是/inbox下的一个子路由:state( . )语法指定了它使子路由。/inbox/1将匹配第一个路由,而/index/1/priority会匹配第二个路由。使用这种语法,在父视图中的ui-view元素将会由第二个路由控制。


### 八、Params 路由参数


      params选项是一个包含路径中的参数和正则表达式匹配结果的数组。该选项不能和url选项混用!当某状态被激活时,应用将这个数组赋值给$stateParams服务。


### 九、Views 视图


      开发者可以在一个状态中设置多个有名称的视图。该功能在ui-router中很强大,开发者可以在同一个模板中改变和切换不同的视图。


      <如果设置了视图选项,则该状态的‘template’,‘templateUrl’及‘templateProvider’将被忽略。如果想在路由里包含父级模板,就需要创建一个包含模板的抽象模板。


例如有这样的视图:



```

接下来就可以创建将被分别被插入到上述ui-view的有命名的视图了,每个子视图可以包含自己的模板、控制器和预载入数据。

$stateProvider

  .state('inbox', {

    views: {

      'filters': {

        template: '<h4>Filter inbox</h4>',

        controller: function($scope) {}

      },

      'mailbox': {

        templateUrl: 'partials/mailbox.html'

      },

      'priority': {

        template: '<h4>Priority inbox</h4>',

        resolve: {

          facebook: function() {

            return FB.messages();

          }

        }

      }

    }

  });

十、abstract 抽象模板

抽象模板不能被激活,但是它的子模板可以被激活。抽象模板可以提供一个包括了多个有名的视图的模板,或者它可以传递作用域变量$scope给子模板。使用它可以在同一个url下传递自定义数据或者预载入的依赖。除了需要添加abstract属性外,其他设置和设定一个常规状态是相同的:

$stateProvider

  .state('admin', {

    abstract: true,

    url: '/admin',

    template: '<div ui-view></div>'

  })

  .state('admin.index', {

    url: '/index',

    template: '<h3>Admin index</h3>'

  })

  .state('admin.users', {

    url: '/users',

    template: '<ul>...</ul>'

  });


十一、onEnter,onExit 回调函数

当应用进入或者离开当前状态的视图时会调用这两个函数。这两个函数可以访问预载入的数据。这两个回调函数使开发者可以根据状态改变来采取某些动作,例如在用户要离开时可以弹出对话框‘你确定吗?’以及防止意外操作等。

十二、Data 数据

自定义数据也可以被附加到状态控制对象state configObject.该数据和预载入数据resolve属性相似,但是该数据不会被注入到控制器中,promise也不会被预载入,它的用途是从父状态传递数据到子状态。

十三、事件

和ngRoute相同的是,angular-route服务会在不同的状态生命周期lifecycle里启动某些事件events。监听 s c o p e 对象便可以捕获这些事件然后采取不同的响应或者操作。如下的事件将会在 scope对象便可以捕获这些事件然后采取不同的响应或者操作。如下的事件将会在 scope对象便可以捕获这些事件然后采取不同的响应或者操作。如下的事件将会在rootScope上触发,因此在任何$scope对象上都可以监听到这些事件。

13.1 状态改变事件
$scope.$on('$stateChangeStart', 

function(evt, toState, toParams, fromState, fromParams), {

  // 如果需要阻止事件的完成

  evt.preventDefault();


### 最后

面试题千万不要死记,一定要自己理解,用自己的方式表达出来,在这里预祝各位成功拿下自己心仪的offer。
**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**

![大厂面试题](https://img-blog.csdnimg.cn/img_convert/63e26152c4b8aff9def1b131ca73e376.webp?x-oss-process=image/format,png)

![面试题目录](https://img-blog.csdnimg.cn/img_convert/bda56bb63df2548caf18d391cc3b81e8.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/3b1d3e72fb0e3f037606f8805754ac7e.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/ca5020ee4570743f6caffcef4e95bc49.webp?x-oss-process=image/format,png)





rams), {

  // 如果需要阻止事件的完成

  evt.preventDefault();


### 最后

面试题千万不要死记,一定要自己理解,用自己的方式表达出来,在这里预祝各位成功拿下自己心仪的offer。
**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**

[外链图片转存中...(img-xhJpwRTD-1715772501251)]

[外链图片转存中...(img-kXThdHzH-1715772501252)]

[外链图片转存中...(img-yv0UGK9s-1715772501253)]

[外链图片转存中...(img-HgakmG43-1715772501253)]





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值