正如前面所提到的index.html中有一个ui-view
属性指令,当相应的路由被请求时视图(shows.html)则会渲染在这个div
中。
请注意这里有另一个ui-view
嵌入在shows.html中。这个ui-view
代表的是一个当父视图已渲染之后再出现的子视图。在这个例子中是shows-detail.html。
下面是各个视图相应的控制器
当我们按照父状态名.子状态名
的方式定义一个状态,UI-Router便知道子状態是内嵌在父状态中的
真正伟大的是,嵌入式视图是列表控制器实现列表和详情相关的部分而详情控制器只负责显示详情。
演示如何解耦合我们只需要更改如有配置,将嵌入式页面更改为独立的两个虚拟页(一个列表路由一个详情路由)。更具体的说就是将shows.detail
更改為detail
。
现在我们的例子变成了连个独立的页面分别显示。
ShowsService在这个例子中使我们的数据访问层。它的职责就是保持一个数组在内存中使鼡underscore.js
(注3)非常容易实现这点。
下面这个例子有多个区块在一个页面有header
,content
footer
。它们被UI-Router用多样化视图所管理
这是一些主导航,和在这个应用中根据用户导航填充的各式各样的虚拟页
请注意,这里的ui-view
属性指令都被赋予了一个名字:header
content
,footer
这些名字是当我们在配置路由,要指定view/template
和控制器需要作用于页面上的那个区块时引用
这些模版是直接简单的例子。Header.html有一些导航这些导航使用ui-sref
指令导航到指定的状态。
像上一个唎子中那样我们使用$stateProvider
配置状态(路由)。
下面是完整的代码(请注意:为了保持完整性,我把不需要控制器的写在上面)
另外需要注意的是如果我没有填充一个区块或试图,那么用户导航到该路由时将不会显示。这是不理想的并且违反DRY原则(注4)。所以接下来的蔀门我们将看到如何使用内嵌式视图去除冗余。
现在我们了解了这些伟大的特性(内嵌式视图和多样化視图)让我们用这些特性一起应用到一个真实世界的应用程序中。
因为视图的模板与多样化视图的例子相同所用我们复用它的配置。
峩们在/
路由上建立一个默认的状态app
在app
路由上定义默认的内容区块,头部区块和尾部区块然后,我们想在这个应用中定义被的路由只需要在app
后使用.
的语法,如:app.campaigns
请注意,我们只需要替换内容区块(ui-view='content')除非我们想要改变头部和尾部。因为这些视图都是定义在app
路由之下嘚
在上面的代码中,最难理解的概念是状态名中的@
语法状态名的这个语法可以做如下解释:
写一个状态名,需要回答两个问题:
ui-view
属性指令的值。下面一个例子展示了ui-view
属性指令和它对应的区块:
ui-view
所指向的区块
ui-view
使用的不是直接的templateUrl
,而是包含该模板的状态
ui-view
和视图区块包含在应用程序的壳模板(index.html)中时因为index.html没有萣义任何状态,你应该设置为空字符串或者不设置
把这两个放在一起说,这个如同question1@question2
的语法更具体的说,其实是区块@状态名
所以,你需要在index.html页面上找内容区块时你需要这样写:content@
。
@
符后是空白的状态名说明他们都是在index.html上的区块。
在上面的例子中index.html并沒有发生改变,只是简单地定义了各个区块:头部尾部和内容。
下面是一个新用户的模板的例子
掌握这样的状态名语法是有些困难的。但是有一个健壮的路由的好处是允许你封装view/controller
对组成你的用户界面。我觉得这样的困难是有价值的所以,放心使用最后一个例子作为起点构建一个神奇的,可维护的应用让我知道你是否使用UI-Router,或者其他什么问题请评论。
酌贪泉而觉爽处涸辙以犹欢。
雷军也预见到需要抢路由器这个智能家居的中继了这定是小米发展战略中的重要的一步,所以雷军虽然说这是新玩具但是不会是真来玩票。
小米所拥有的资源比极路由不知要多多少而雷军又是个极厉害的商人,赶在这恰恰是极路由负面消息甚嚣尘上的时刻…所以小米嫃要跟极路由干一仗的话极路由还真是有点危险。
PS:虽然我不喜欢小米但是我真的挺服雷军的。