1. 程式人生 > >2、Angular-Ui Router 巢狀狀態和巢狀檢視

2、Angular-Ui Router 巢狀狀態和巢狀檢視


Methods for Nesting States
巢狀狀態的方法

States can be nested within each other. There are several ways of nesting states:
狀態可以相互巢狀,巢狀狀態有幾種方法:

  1. Using 'dot notation'. For example .state('contacts.list', {}).
    使用“點記法”。例如, .state('contacts.list', {})。
  2. Use the ui-router.stateHelper to build states from a nested state tree. Courtesy of @marklagendijk.
     
    使用ui-router.stateHelper從巢狀狀態樹建立狀態。感謝@marklagendijk的貢獻。
  3. Using the parent property with the parent name as string. For example: parent: 'contacts'
    使用父屬性與父名字串。例如:parent: 'contacts'
  4. Using the parent property with the parent object. For example parent: contacts (where 'contacts' is a stateObject)
    使用父屬性與父物件值一起使用。例如parent: contacts(“contacts”是一個狀態物件)

Dot Notation
點記法

You can use dot syntax to infer your hierarchy to the $stateProvider. Below, contacts.listbecomes a child of contacts.
您可以使用點語法來推斷您的$stateProvider層次結構。下面的contacts.list變成了contacts的子狀態。

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

stateHelper module
stateHelper模組

This is a 3rd party module created by @marklagendijk. So you have to include it in addition

 to ui-router. Visit the stateHelper repo to learn more
這是由@marklagendijk建立的第三方模組。所以你必須在ui-router之外加上它。訪問stateHelper瞭解更多資訊

angular.module('myApp', ['ui.router', 'ui.router.stateHelper'])
  .config(function(stateHelperProvider){
    stateHelperProvider.state({
      name: 'root',
      templateUrl: 'root.html',
      children: [
        {
          name: 'contacts',
          templateUrl: 'contacts.html',
          children: [
            {
              name: 'list',
              templateUrl: 'contacts.list.html'
            }
          ]
        },
        {
          name: 'products',
          templateUrl: 'products.html',
          children: [
            {
              name: 'list',
              templateUrl: 'products.list.html'
            }
          ]
        }
      ]
    });
  });

Parent Property using State Name String
使用狀態名稱的父屬性

Alternately, you can specify the parent of a state via the parent property.
您可以通過父屬性指定狀態的父狀態。

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

Object-based States
基於物件的狀態

If you aren't fond of using string-based states, you can also use object-based states. The nameproperty goes in the object and the parent property must be set on all child states, like this:
如果您不喜歡使用基於字串的狀態,那麼也可以使用基於物件的狀態。name屬性在物件中,父屬性必須在所有子節點上設定,如下:

var contacts = { 
    name: 'contacts',
    templateUrl: 'contacts.html'
}
var contactsList = { 
    name: 'list',
    parent: contacts,
    templateUrl: 'contacts.list.html'
}

$stateProvider
  .state(contacts)
  .state(contactsList)

You can usually reference the object directly when using other methods and property comparisons:
在使用其他方法或屬性比較時, 通常可以直接引用該物件:

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

Registering States Order
註冊狀態順序

You can register states in any order and across modules. You can register children before the parent state exists. It will queue them up and once the parent state is registered then the child will be registered.
您可以按任意順序和跨模組註冊狀態。您可以在父狀態存在之前註冊子狀態。它將對它們進行排隊, 一旦註冊了父狀態, 就會註冊該父狀態的子狀態。

Parent MUST Exist
父狀態必須存在

If you register only a single state, like contacts.list, you MUST define a state called contacts at some point, or else no states will be registered. The state contacts.list will get queued until contacts is defined. You will not see any errors if you do this, so be careful that you define the parent in order for the child to get properly registered.
如果只註冊單個狀態 (如 "contacts.list"), 則必須在某個點定義一個稱為 "contacts" 的狀態, 否則將不註冊任何狀態。狀態contacts.list將被排入佇列, 直到定義了contacts狀態。如果您沒有定義contacts狀態, 您將看不到任何錯誤, 因此請謹慎地定義父狀態, 以便使子狀態正確註冊。

Naming Your States
命名您的狀態

No two states can have the same name. When using dot notation the parent is inferred, but this doesn't change the name of the state. When explicitly providing a parent using the parentproperty, state names still must be unique. For example, you can't have two different states named "edit" even if they have different parents.

Nested States & Views
巢狀狀態&檢視

When the application is in a particular state—when a state is "active"—all of its ancestor states are implicitly active as well. Below, when the "contacts.list" state is active, the "contacts" state is implicitly active as well, because it's the parent state to "contacts.list".
當應用程式狀態處於“活動狀態”時,其所有的祖先狀態也都是隱式的活動。下面,當“contacts.list”狀態是活動的,“contacts”狀態也是隱式活動的,因為它是“contacts.list”的父狀態。

Child states will load their templates into their parent's 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>

What Do Child States Inherit From Parent States?
子狀態從父狀態那裡繼承了什麼?

Child states DO inherit the following from parent states:
子狀態從父狀態繼承以下內容:

Nothing else is inherited (no controllers, templates, url, etc). However, children of abstract states do inherit the url property of their parent as a prefix of their own url.
除此之外沒有別的東西可繼承 (包括控制器、模板、url 等)。然而, 抽象狀態的子狀態確實繼承其父狀態的 url 屬性作為其自己的 url 的字首。

Inherited Resolved Dependencies
繼承的解析依賴關係

New in version 0.2.0

Child states will inherit resolved dependencies from parent state(s), which they can overwrite. You can then inject resolved dependencies into the controllers and resolve functions of child states.
子狀態將從父狀態(s)繼承已解析的依賴項,它們可以覆蓋這些依賴項。然後,您可以將解析的依賴項注入控制器,並解析子狀態的函式。

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

NOTE
注意
:

  • The resolve keyword MUST be relative to state not views (in case you use multiple views).
    解析關鍵字必須是相對於狀態而不是檢視(以防您使用多個檢視)。
  • If you want a child resolve to wait for a parent resolve, you should inject the parent resolve keys into the child. (This behavior is different in ui-router 1.0).
    如果您希望一個子解析等待父解析,那麼您應該將父解析注入到子解析中。(這種行為在ui-router 1.0中是不同的)。

Inherited Custom Data
繼承自定義資料

Child states will inherit data properties from parent state(s), which they can overwrite.
子狀態將從父狀態繼承資料屬性, 子狀態可以覆蓋它們。

$stateProvider.state('parent', {
      data:{
         customData1:  "Hello",
         customData2:  "World!"
      }
   })
   .state('parent.child', {
      data:{
         // customData1 inherited from 'parent'
         // but we'll overwrite customData2
         customData2:  "UI-Router!"
      }
   });

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

    // Would print "Hello World!" when 'parent' is activated
    // Would print "Hello UI-Router!" when 'parent.child' is activated
})

Scope Inheritance by View Hierarchy Only
僅按檢視層次結構範圍繼承

Keep in mind that scope properties only inherit down the state chain if the views of your states are nested. Inheritance of scope properties has nothing to do with the nesting of your states and everything to do with the nesting of your views (templates).
請記住,如果您的狀態的檢視是巢狀的,那麼範圍屬性只繼承狀態鏈。範圍屬性的繼承與您的狀態的巢狀無關,與您的檢視的巢狀(模板)有關。

It is entirely possible that you have nested states whose templates populate ui-views at various non-nested locations within your site. In this scenario you cannot expect to access the scope variables of parent state views within the views of children states.
您可能有巢狀的狀態,它們的模板在您的站點內的不同的非巢狀位置填充ui-view。在這個場景中,您不能期望在子狀態檢視中訪問父狀態檢視的範圍變數。

View Inherited Resolved Dependencies
檢視繼承已解析的依賴項

Views may inherit resolved dependencies from the state that they belong to, but may not inherit those of their sibling views.
檢視可以從它們所屬的狀態繼承已解析的依賴項,但可能不會繼承它們的兄弟檢視。

$stateProvider.state('myState', {
  resolve:{
     resMyState:  function(){
        return { value: 'mystate' };
     }
  },
  views: {
    '[email protected]': {
      templateUrl: 'mystate-foo.html',
      controller: function($scope, resMyState, resFoo){ 
        /* has access to resMyState and resFoo,
           but *not* resBar */ 
      },
      resolve: {
        resFoo: function() {
          return { value: 'foo' };
        }
      },
    },
    '[email protected]': {
      templateUrl: 'mystate-bar.html',
      controller: function($scope, resMyState, resBar){ 
        /* has access to resMyState and resBar,
           but *not* resFoo */ 
      },
      resolve: {
        resBar: function() {
          return { value: 'bar' };
        },
      },
    },
  },
});

Abstract States
抽象狀態

An abstract state can have child states but can not get activated itself. An 'abstract' state is simply a state that can't be transitioned to. It is activated implicitly when one of its descendants are activated.
抽象狀態可以有子狀態,但不能被啟用。一個“抽象”的狀態就是一個不能被主動啟用的狀態。當它的一個後代被啟用時,它會被隱式啟用。

Some examples of how you might use an abstract state are:
一些關於如何使用抽象狀態的例子是:

  • To prepend a url to all child state urls.
    將 url 預置為所有子狀態 url。
  • To insert a template with its own ui-view(s) that its child states will populate.
    要將子狀態插入自己的ui-view(s)的模板。
    • Optionally assign a controller to the template. The controller must pair to a template.
      (可選) 將控制器分配給模板。控制器必須與模板配對。
    • Additionally, inherit $scope objects down to children, just understand that this happens via the view hierarchy, not the state hierarchy.
      另外,將$scope物件繼承給子物件,只需要知道這是通過檢視層次結構而不是狀態層次結構來實現的。
  • To provide resolved dependencies via resolve for use by child states.
    通過解析(Resolve)為子狀態提供依賴關係。
  • To provide inherited custom data via data for use by child states or an event listener.
    通過資料為子狀態或事件監聽器提供可繼承的自定義資料。
  • To run an onEnter or onExit function that may modify the application in someway.
    執行一個onEnter或onExit函式,它可以以某種方式修改應用程式。
  • Any combination of the above.
    以上的任何組合。

Remember: Abstract states still need their own <ui-view/> for their children to plug into. So if you are using an abstract state just to prepend a url, set resolves/data, or run an onEnter/Exit function, then you'll additionally need to set template: "<ui-view/>".
請記住:抽象的狀態仍然需要他們自己的孩子去插入。因此,如果您正在使用一個抽象的狀態來預先設定一個url,設定resolves/data,或者執行一個onEnter/Exit函式,那麼您還需要設定模板:“”。

Abstract State Usage Examples:
抽象狀態用法示例:

To prepend url to child state urls
將 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
    })

To insert a template with its own ui-view for child states to populate
要插入一個帶有自己的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>

Combination
組合

Shows prepended url, inserted template, paired controller, and inherited $scope object.
顯示預先輸入的url、插入的模板、成對的控制器和繼承的$scope物件。

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

相關推薦

2Angular-Ui Router 狀態檢視

Methods for Nesting States巢狀狀態的方法States can be nested within each other. There are several ways of nesting states:狀態可以相互巢狀,巢狀狀態有幾種方法:Using

1Angular-Ui Router 狀態概要

狀態管理器.新的狀態管理器($stateProvider) 類似於Angular's v1 的路由工作方式, 但更完美.A state corresponds to a "place" in the application in terms of the overall UI

Angular-ui-router進階二之檢視與多個檢視組合使用

ui-router巢狀檢視 巢狀檢視是ui-router不同於ng-route的最大區別之一,也是ui-router受到大眾青睞的主要原因。接下來跟小編直接上手做一下簡單的巢狀檢視(Nested Views)。 上面是本次示例的佈局,有導航欄、側邊欄、檢視1及其子孫檢

ui-router中路由的二級

關於ui-router中巢狀路由中的問題 1.首先我們的頁面層次為 其中Main.html是我們的主頁,我們要在main.html中對路由進行統一的管理。 main.html頁面中有一個ui-view在這裡將填充PageTab.html,同時被填充的P

angular-ui-router

1-43 class att view desc asc 初始 config family 1.簡單示例 1 <html> 2 <head> 3 <title>ui-router</title>

使用angular ui-router的一點感受

一、背景 今年3月份從一個同事那裡接手了一個angular專案,心裡有血竊喜,自己花了兩個星期自學的angular終於可以用上戰場啦!不久,那個同事離職啦,整個專案落在了我的手裡,就在專案快要上線時,領導說,要加一點新的功能。想著又要加班啦,我心裡一萬隻草泥馬

angular+ui-router+layui的使用心得

近來,完成公司的一個專案,專案使用angular+ui-router+layui框架開發,由於剛剛接觸angularjs,因此遇到各種各樣的坑。在這裡記下印象最深的幾個坑; 一、ng-repeat 當陣列元素有至少兩個相同時,報Error: [ngRe

angular-ui-router檢視views

UI Router 中有三種方式啟用一個路由: (1)$state.go():優先順序較高的便利方式 (2)ui-sref:點選包含此指令跳轉 (3)url:url導航 一、$state.go() (1)$state.go(to [, toPa

angular ui-router 路由預設跳轉語句$urlRouterProvider.otherwise(‘路徑');與共用時存在的問題

當angular路由設定預設跳轉路徑$urlRouterProvider.otherwise(‘default'),並且頁面存在<a>標籤並且<a>標籤設定屬性href="###"即<a href="###></a>時,每次點

Angularjs1.x+ocLazyLoad+angular-ui-router+ui-router-extras

前言 總是聽人說angularjs的學習曲線很高,個人認為ng的難度是有的,但是要說難到哪裡,其實也不見得。總結來說,ng比較有難度的地方應當是路由和lazy載入。今天就把這部分內容通過一個小示例分享給大家。 依賴 專案包結構 程式碼

2Android-UI(上)

color 註冊 ESS 最大 不可 oncreate conda this 增加 2.1、如何編寫程序頁面 Android中有許多編寫程序的方式可供選擇 Android Studio和Eclipse中都提供了響應的可視化編輯器 可以直接再進行拖動創建布局 推薦使用

2Android-UI(自定義控件&ListView)

dap mat 重載 group 引入 log match 出現 androi 2.4、系統控件不夠用創建自定義控件 控件的和布局的集成結構: 所有的控件都是間接或者直接集成View的 所有的布局都是直接或者間接繼承自ViewGroup的 View是And

【MySQL】2MySQL 創建數據庫

數值 加鎖 字母 發送 lint 引擎 code font reat 2.MySQL 創建數據庫和表 2.1、創建數據庫 CREATE DATABASE 語句用於在 MySQL 中創建數據庫。 CREATE DATABASE database_name 為了讓 PH

2陣列(線性表)特點應用分析

   在計算機記憶體組織中,只有兩種資料儲存的基本方式:陣列和連結串列。 <1>陣列管理 int a[100]; //就是在記憶體中申請100個連續的sizeof(int)空間。 int *p = malloc(100*sizeof(int)); //在堆中

3.2Dcoker-1.12 search(搜尋映象)pull(拉取映象)[五]

3.2、Dcoker-1.12search(搜尋映象)和pull(拉取映象)       這一篇的內容比較簡單,也不復雜。既然入門docker,咱們得學會怎麼得到映象。       search搜尋docker雲平臺相關的映象       pull   根據名稱拉取映象  

第 09 節路由:Router 中的屬性路由模式

目錄 現在我們已經掌握了React路由導航的基本方法,這節學習一下標籤上的屬性和用法。這節還有一個重點就是路由的5種模式。 basename屬性 <Router basename="demo"> <div

4.2Android Studio壓縮你的程式碼資源

為了讓你的APK檔案儘可能的小,你需要在構建的時候開啟壓縮來移除無用的程式碼和資源。 程式碼壓縮可在ProGuard中使用,可以檢測和清除無用的類,變數,方法和屬性,甚至包括你引用的庫。ProGuard同樣可以優化位元組碼,移除無用的程式碼,並且模糊剩下的類,

【Android】achartengine的柱圖的使用

原文地址:http://www.cnblogs.com/wangcan/p/3459551.html 本文介紹了android中如何使用achartengine繪製餅圖和柱狀圖,請分別嘗試餅圖和柱狀圖。 程式碼中的註釋解釋了圖示中的各種設定的使用方法。 一.acha

angularJs模組ui-router狀態檢視

狀態巢狀的方法 狀態可以相互巢狀。有三個巢狀的方法: 使用“點標記法”,例如:.state('contacts.list', {})使用parent屬性,指定一個父狀態的名稱字串,例如:parent: 'contacts'使用parent屬性,指定一個父狀態物件,例如

第3篇:angularJS使用ui-router路由配置

引入js檔案: <script type="text/javascript" src="lib/angular/angular-1.3.0.js"></script>