全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

状态嵌套的方法

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

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

点标记法

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

$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>

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

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

  1. 通过解决器解决的依赖注入项
  2. 自定义的data属性

除了这些,没有其他属性继承下来(比如controllers、templates和url等)

继承解决的依赖项

版本 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 抽象状态

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

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

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

请记住:抽象的状态模板仍然需要<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>

完整示例

$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}}" rel="external nofollow" >{{person.name}}</a>
  </li>
</ul>
<!-- contacts.detail.html -->
<h2>{{ person.name }}</h2>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# angularjs  # 状态嵌套  # 视图嵌套  # ui  # router  # 嵌套视图  # 详解angularjs 关于ui-router分层使用  # AngularJS路由Ui-router模块用法示例  # 详解AngularJS1.6版本中ui-router路由中/#!/的解决方法  # 详解AngularJs ui-router 路由的简单介绍  # angularjs ui-router中路由的二级嵌套  # AngularJS ui-router (嵌套路由)实例  # 浅析angularJS中的ui-router和ng-grid模块  # Angularjs中UI Router的使用方法  # Angularjs中UI Router全攻略  # AngularJS 使用 UI Router 实现表单向导  # 深究AngularJS之ui-router详解  # 自定义  # 重写  # 可以使用  # 提供一个  # 应用程序  # 自己的  # 是一个  # 如果您  # 他是  # 将在  # 你不  # 能在  # 也将  # 能让  # 能有  # 将被  # 可以直接  # 都将  # 会使  # 你将 


相关文章: 北京网站制作的公司有哪些,北京白云观官方网站?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  东莞专业制作网站的公司,东莞大学生网的网址是什么?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  高端云建站费用究竟需要多少预算?  建站之星客服服务时间及联系方式如何?  如何用花生壳三步快速搭建专属网站?  已有域名和空间如何快速搭建网站?  北京专业网站制作设计师招聘,北京白云观官方网站?  如何快速搭建高效简练网站?  宝塔建站助手安装配置与建站模板使用全流程解析  如何零基础开发自助建站系统?完整教程解析  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  广州美橙建站如何快速搭建多端合一网站?  建站10G流量真的够用吗?如何应对访问高峰?  XML的“混合内容”是什么 怎么用DTD或XSD定义  香港网站服务器数量如何影响SEO优化效果?  如何零成本快速生成个人自助网站?  Swift中switch语句区间和元组模式匹配  定制建站方案优化指南:企业官网开发与建站费用解析  网站制作公司,橙子建站是合法的吗?  英语简历制作免费网站推荐,如何将简历翻译成英文?  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  如何确保FTP站点访问权限与数据传输安全?  油猴 教程,油猴搜脚本为什么会网页无法显示?  如何通过网站建站时间优化SEO与用户体验?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  实例解析angularjs的filter过滤器  微课制作网站有哪些,微课网怎么进?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  建站主机如何安装配置?新手必看操作指南  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何选择高效便捷的WAP商城建站系统?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  建站之星备案流程有哪些注意事项?  如何基于云服务器快速搭建个人网站?  ,柠檬视频怎样兑换vip?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  网站按钮制作软件,如何实现网页中按钮的自动点击?  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  建站之星免费版是否永久可用?  宝塔新建站点报错如何解决?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  如何快速搭建个人网站并优化SEO?  如何通过山东自助建站平台快速注册域名?  网站制作企业,网站的banner和导航栏是指什么?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  网站制作公司排行榜,抖音怎样做个人官方网站  如何高效利用亚马逊云主机搭建企业网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。