这篇文章主要介绍了angularJs模块ui-router之状态嵌套和视图嵌套的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

状态嵌套的方法
状态可以相互嵌套。有三个嵌套的方法:
- 使用“点标记法”,例如:.state('contacts.list', {}) 
- 使用parent属性,指定一个父状态的名称字符串,例如:parent: 'contacts' 
- 使用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');
}My Contacts
子状态将从父状态继承哪些属性?
子状态将从父母继承以下属性:
- 通过解决器解决的依赖注入项 
- 自定义的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 抽象状态
一个抽象的状态可以有子状态但不能显式激活,它将被隐性激活当其子状态被激活时。
下面是一些你将可能会使用到抽象状态的示例:
- 为所有子状态预提供一个基url 
- 在父状态中设置template属性,子状态对应的模板将插入到父状态模板中的ui-view(s)中 
- 通过resolve属性,为所有子状态提供解决依赖项 
- 通过data属性,为所有子状态或者事件监听函数提供自定义数据 
- 运行onEnter或onExit函数,这些函数可能在以某种方式修改应用程序。 
- 上面场景的任意组合 
请记住:抽象的状态模板仍然需要
抽象状态使用示例:
为子状态提供一个基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中
$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 Page
完整示例
$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 Page
{{ person.name }}
感谢你能够认真阅读完这篇文章,希望小编分享的“angularJs模块ui-router之状态嵌套和视图嵌套的示例分析”这篇文章对大家有帮助,同时也希望大家多多支持创新互联建站,关注创新互联网站建设公司行业资讯频道,更多相关知识等着你来学习!
另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网站栏目:angularJs模块ui-router之状态嵌套和视图嵌套的示例分析-创新互联
转载源于:http://www.scyingshan.cn/article/cosjdi.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 