`
liujiekasini0312
  • 浏览: 147308 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

angularJs模块ui-router之状态嵌套和视图嵌套

 
阅读更多

原文地址:http://bubkoo.com/2014/01/01/angular/ui-router/guide/nested-states%20&%20nested-views/

状态嵌套的方法

状态可以相互嵌套。有三个嵌套的方法:

  1. 使用“点标记法”,例如:.state('contacts.list', {})
  2. 使用parent属性,指定一个父状态的名称字符串,例如:parent: 'contacts'
  3. 使用parent属性,指定一个父状态对象,例如:parent: contacts(contacts 是一个状态对象)

点标记法

$stateProvider中可以使用点语法来表示层次结构,下面,contacts.listcontacts的子状态。

$stateProvider
  .state('contacts', {})
  .state('contacts.list', {});

使用parent属性,指定一个父状态的名称字符串

复制代码
$stateProvider
  .state('contacts', {})
  .state('list', {
    parent: 'contacts'
  });
复制代码

基于对象的状态

如果你不喜欢使用基于字符串的状态,您还可以使用基于对象的状态。name属性将在状态对象内部设置,在所有的子状态对象中设置parent属性为父状态对象,像下面这样:

复制代码
var contacts = { 
    name: 'contacts',  //mandatory
    templateUrl: 'contacts.html'
}
var contactsList = { 
    name: 'list',      //mandatory
    parent: contacts,  //mandatory
    templateUrl: 'contacts.list.html'
}

$stateProvider
  .state(contacts)
  .state(contactsList)
复制代码

$state.transitionTo(states.contacts);在方法调用和属性比较时可以直接引用状态对象:

$state.current === states.contacts;
$state.includes(states.contacts)


注册状态的顺序

可以以任何顺序跨模块注册状态,也可以在父状态存在之前注册子状态。一旦父状态被注册,将触发自动排序,然后注册子状态。

状态命名

状态不允许重名,当使用“点标记法”,parent属性被推测出来,但这并不会改变状态的名字;当不使用“点标记法”时,parent属性必须明确指定,但你仍然不能让任何两个状态有相同的名称,例如你不能有两个不同的状态命名为”edit”,即使他们有不同的父状态。

嵌套状态和视图

当应用程序在一个特定的状态 - 当一个状态是活动状态时 - 其所有的父状态都将成为活跃状态。下面例子中,当”contacts.list”是活跃状态时,”contacts”也将隐性成为活跃状态,因为他是”contacts.list”的父状态。

子状态将把其对应的模板加载到父状态对应模板的ui-view中。

复制代码
$stateProvider
  .state('contacts', {
    templateUrl: 'contacts.html',
    controller: function($scope){
      $scope.contacts = [{ name: 'Alice' }, { name: 'Bob' }];
    }
  })
  .state('contacts.list', {
    templateUrl: 'contacts.list.html'
  });

function MainCtrl($state){
  $state.transitionTo('contacts.list');
}
复制代码
<!-- index.html -->
<body ng-controller="MainCtrl">
  <div ui-view></div>
</body>
<!-- contacts.html -->
<h1>My Contacts</h1>
<div ui-view></div>
复制代码
<!-- contacts.list.html -->
<ul>
  <li ng-repeat="contact in contacts">
    <a>{{contact.name}}</a>
  </li>
</ul>
复制代码

子状态将从父状态继承哪些属性?

子状态将从父母继承以下属性:

  • 通过解决器解决的依赖注入项
  • 自定义的data属性
    除了这些,没有其他属性继承下来(比如controllerstemplatesurl等)

继承解决的依赖项

版本 v0.2.0 的新特性

子状态将从父状态继承通过解决器解决的依赖注入项,并且可以重写(overwrite)依赖项,可以将解决依赖项注入子状态的控制器和解决函数中。

复制代码
$stateProvider.state('parent', {
      resolve:{
         resA:  function(){
            return {'value': 'A'};
         }
      },
      controller: function($scope, resA){
          $scope.resA = resA.value;
      }
   })
   .state('parent.child', {
      resolve:{
         // 将父状态的解决依赖项注入到子状态的解决函数中
         resB: function(resA){
            return {'value': resA.value + 'B'};
         }
      },
      // 将父状态的解决依赖项注入到子状态的控制器中
      controller: function($scope, resA, resB){
          $scope.resA2 = resA.value;
          $scope.resB = resB.value;
      }
复制代码

继承自定义data属性值

子状态将从父状态继承自定义data属性值,并且可以重写(overwrite)data属性值

复制代码
$stateProvider.state('parent', {
      data:{
         customData1:  "Hello",
         customData2:  "World!"
      }
   })
   .state('parent.child', {
      data:{
         // customData1 inherited from 'parent'
         // 覆盖了 customData2 的值
         customData2:  "UI-Router!"
      }
   });

$rootScope.$on('$stateChangeStart', function(event, toState){ 
    var greeting = toState.data.customData1 + " " + toState.data.customData2;
    console.log(greeting);

    // 'parent'被激活时,输出 "Hello World!"
    // 'parent.child'被激活时,输出 "Hello UI-Router!"
})
复制代码

Abstract States 抽象状态

一个抽象的状态可以有子状态但不能显式激活,它将被隐性激活当其子状态被激活时。

下面是一些你将可能会使用到抽象状态的示例:

  • 为所有子状态预提供一个基url
  • 在父状态中设置template属性,子状态对应的模板将插入到父状态模板中的ui-view(s)
  • 通过resolve属性,为所有子状态提供解决依赖项
  • 通过data属性,为所有子状态或者事件监听函数提供自定义数据
  • 运行onEnteronExit函数,这些函数可能在以某种方式修改应用程序。
  • 上面场景的任意组合

请记住:抽象的状态模板仍然需要<ui-view/>,来让自己的子状态模板插入其中。因此,如果您使用抽象状态只是为了预提供基url、提供解决依赖项或者自定义data、运行onEnter/Exit函数,你任然需要设置template: "<ui-view/>"

抽象状态使用示例:

为子状态提供一个基url,子状态的url是相对父状态的

复制代码
$stateProvider
    .state('contacts', {
        abstract: true, 
    url: '/contacts',

        // Note: abstract still needs a ui-view for its children to populate.
        // You can simply add it inline here.
        template: '<ui-view/>'
    })
    .state('contacts.list', {
    // url will become '/contacts/list'
        url: '/list'
    //...more
    })
    .state('contacts.detail', {
    // url will become '/contacts/detail'
        url: '/detail',
    //...more
    })
复制代码

将子状态模板插入到父状态指定的ui-view

复制代码
$stateProvider
    .state('contacts', {
        abstract: true,
        templateURL: 'contacts.html'
    )
    .state('contacts.list', {
        // loaded into ui-view of parent's template
        templateUrl: 'contacts.list.html'
    })
    .state('contacts.detail', {
        // loaded into ui-view of parent's template
        templateUrl: 'contacts.detail.html'
    })
复制代码
<!-- contacts.html -->
<h1>Contacts Page</h1>
<div ui-view></div>

完整示例:http://plnkr.co/edit/gmtcE2?p=preview组合使用示例

复制代码
$stateProvider
    .state('contacts', {
        abstract: true,
        url: '/contacts',
        templateUrl: 'contacts.html',
        controller: function($scope){
            $scope.contacts = [{ id:0, name: "Alice" }, { id:1, name: "Bob" }];
        }            
    })
    .state('contacts.list', {
        url: '/list',
        templateUrl: 'contacts.list.html'
    })
    .state('contacts.detail', {
        url: '/:id',
        templateUrl: 'contacts.detail.html',
        controller: function($scope, $stateParams){
          $scope.person = $scope.contacts[$stateParams.id];
        }
    })
复制代码
<!-- contacts.html -->
<h1>Contacts Page</h1>
<div ui-view></div>
复制代码
<!-- contacts.list.html -->
<ul>
    <li ng-repeat="person in contacts">
        <a ng-href="#/contacts/{{person.id}}">{{person.name}}</a>
    </li>
</ul>
复制代码
<!-- contacts.detail.html -->
<h2>{{ person.name }}</h2>
分享到:
评论

相关推荐

    详解angularJs模块ui-router之状态嵌套和视图嵌套

    总结,AngularJS UI-Router的状态嵌套和视图嵌套提供了一种强大的方式来组织复杂的视图结构。通过状态嵌套,我们可以创建层级清晰的应用架构,而视图嵌套则使得不同级别的视图可以协同工作,提高了代码的可读性和可...

    Angularjs和ui-router的一个栗子

    默认的AngularJS路由模块ngRoute可以实现基本的路由需求,但当项目变得复杂,涉及到多个视图和嵌套路由时,UI-Router就显得更为强大。 UI-Router的核心概念包括状态(States)和视图(Views)。状态定义了应用的...

    AngularJS ui-router(嵌套路由)

    AngularJS 嵌套路由:这是我针对同一个主题(ui-router)的第二篇文章. 如果你对第一篇文章感兴趣的话,可以... ui-router提供了让我们可以做路由嵌套和视图命名的特性. 我们将在示例中看到ui-router中存在的所有类型.

    AngularJS使用ui-route实现多层嵌套路由的示例

    AngularJS中的ui-router模块是实现客户端应用程序中复杂状态管理的一个非常有用的库,它支持单页应用(SPA)中的多视图和嵌套路由管理。 在使用ui-router来实现多层嵌套路由时,开发者需要按照ui-router的状态配置...

    angularjs ui.router嵌套路由demo

    这个"angularjs ui.router嵌套路由demo"是展示如何在AngularJS项目中使用UI.Router进行多级路由配置和页面嵌套的一个实例。通过这个demo,我们可以深入理解UI.Router的工作原理和实际应用。 首先,UI.Router不同于...

    angularjs + ui-router + bootstrap 构建PC端移动端web项目

    相比AngularJS内置的ngRoute,UI-Router更强大,支持更复杂的路由配置,如嵌套路由、命名视图和抽象状态等。通过UI-Router,开发者可以定义应用的不同状态,并关联到特定的视图和控制器,使得导航更加灵活,页面结构...

    angularjs+require+angular-ui-router

    在本文中,我们将深入探讨如何使用AngularJS、RequireJS和Angular-UI-Router构建一个高效且模块化的前端应用。AngularJS是一种流行的JavaScript框架,用于构建动态网页应用;RequireJS是AMD(Asynchronous Module ...

    AngularJS ui-router (嵌套路由) - OPEN 开发经验库2

    ui-router是AngularJS的一个第三方模块,它扩展了原生的ng-route,提供了更强大的功能,包括支持嵌套路由和命名视图。在本文中,我们将深入探讨如何使用ui-router实现嵌套路由,以及它如何帮助我们构建更复杂的单页...

    ui-router嵌套视图

    总结来说,"ui-router嵌套视图"是一个展示如何在AngularJS应用中使用UI-Router创建和管理嵌套视图的实例。通过这个例子,我们可以学习到如何定义和配置嵌套状态,如何在HTML模板中使用`&lt;ui-view&gt;`,以及如何在控制器...

    angularjs文件及参考文档ui-router

    - **路由和视图**:学习ngRoute的基本用法,以及UI-Router提供的高级路由功能,如状态管理、嵌套路由等。 - **指令系统**:深入探究自定义指令的创建和使用,如何扩展AngularJS的功能。 - **服务**:熟悉内置服务如$...

    angular.js ui-router 用法示例demo

    UI-Router是AngularJS的一个扩展模块,提供了更高级的路由功能,如嵌套路由、命名视图和并行视图等。 标题“angular.js ui-router 用法示例demo”指的是一个展示AngularJS中UI-Router实际应用的实例。这个示例旨在...

    ui-router, 在AngularJS中,使用嵌套视图实现灵活路由的实际解决方案.zip

    ui-router, 在AngularJS中,使用嵌套视图实现灵活路由的实际解决方案 AngularUI路由器 注意:这是用户界面路由器版本1的Angular 1.x 源。 如果你正在寻找路由器版本 0.2的源,那么可以在这里找到它:。 Angular 中...

    前端项目-angular-ui-router.zip

    模态对话框和侧边栏**:UI-Router的状态和视图机制非常适合实现模态对话框或侧边栏等复杂布局,通过嵌套视图和状态轻松控制它们的显示和隐藏。 总的来说,`angular-ui-router.zip`包含的UI-Router库为AngularJS...

    AngularJS路由Ui-router模块用法示例

    当涉及到更复杂的视图结构和嵌套时,AngularJS原生的`ngRoute`模块可能显得力不从心,这就是`UI-Router`模块的用武之地。 `UI-Router`是AngularJS的一个第三方扩展,它提供了更高级的路由功能,包括视图的嵌套、...

    ui-router使用教程

    UI-Router 是 AngularJS 框架中的一个强大的路由插件,它提供了更灵活的导航和视图管理机制,能够实现类似 frameset 的效果,即在不重新加载整个页面的情况下,进行页面内部的局部跳转。在深入探讨 UI-Router 的用法...

    Angular-UI-Router包

    UI-Router被认为是AngularUI为开发者提供的最实用的一个模块,它是一个让开发者能够根据URL状态或者说是'机器状态'来组织和控制界面UI的渲染,而不是仅仅只改变路由(传统AngularJS应用实用的方式)。该模块为开发者...

    前端项目-ui-router-extras.zip

    在前端开发领域,UI Router 是一个非常流行的路由管理库,尤其在 AngularJS 应用程序中。`ui-router-extras` 是 UI Router 的一个扩展插件,它为开发者提供了额外的功能,增强了原生 UI Router 的能力。这个压缩包...

    详解AngularJs路由之Ui-router-resolve(预加载)

    总的来说,`ui-router`的`resolve`功能是提升AngularJS应用性能和用户体验的重要工具。通过在控制器激活之前预加载数据,可以确保页面加载的一致性和流畅性,避免“UI抖动”,并允许代码重用和数据共享。合理利用`...

    深究AngularJS之ui-router详解

    本文将深入解析AngularJS之UI-Router,帮助开发者更好地理解和运用这一工具。 首先,要使用UI-Router,我们需要在HTML文件中引入必要的JavaScript库。确保先引入`angular.min.js`,因为它是AngularJS的核心库,然后...

Global site tag (gtag.js) - Google Analytics