顯示頁面內容指令:<ion-nav-view>
最簡單的多頁面apps是以<ion-nav-view>做為頁面的樣板,而各頁的內容再以<ion-view>標示。至於瀏覽過程中該顯示哪一頁?則由UI-Router決定.,程式中必須告知UI-Router,有幾個states,每一個頁面可能就是一個state,如下圖所示:![]() |
圖1. 定義好樣板與內容後,UI-Router會根據瀏覽歷程決定顯示內容 |
如上圖,index.html的內容只需要加入<ion-nav-view>指令,當成樣板,如:
<body ng-app="starter"> <ion-nav-view> </ion-nav-view> </body>另外再加入兩個states的頁面內容,例如home.html:
以及order.html:
- <ion-view title="首頁">
- <ion-nav-bar>
- <ion-back-buttons></ion-back-buttons>
- </ion-nav-bar>
- <ion-content>
- 首頁內容
- </ion-content>
- <ion-tabs class="tabs-icon-top">
- <ion-tab title="首頁" icon="ion-home" href="/home"></ion-tab>
- <ion-tab title="訂位" icon="ion-compose" href="/order"></ion-tab>
- </ion-tabs>
- </ion-view>
兩者內容幾乎相同,只有第1行的title屬性值,與第6行頁面內容不一樣。其他說明如下:
- <ion-view title="訂位">
- <ion-nav-bar>
- <ion-back-buttons></ion-back-buttons>
- </ion-nav-bar>
- <ion-content>
- 訂位內容
- </ion-content>
- <ion-tabs class="tabs-icon-top">
- <ion-tab title="首頁" icon="ion-home" href="/home"></ion-tab>
- <ion-tab title="訂位" icon="ion-compose" href="/order"></ion-tab>
- </ion-tabs>
- </ion-view>
- 第1-12行:頁面以<ion-view>對應index.html的<ion-nav-view>指令,代表每一個頁面的內容。
- 第2-4行:當頁面樣板是<ion-nav-view>時,每一個頁面都可以用<ion-nav-bar>加入標題列。和<ion-header-bar>不同的是<ion-nav-bar>也會由UI-Router自動套入內容。
- 第3行:在<ion-nav-bar>內,可加入<ion-nav-back-buttons>指令。該指令會視瀏覽狀態決定是否要在標題列加入「返回」按鈕。
- 第5-7行:主要內容放置於<ion-content>內。
- 第8-11行:加上頁籤 (tabs)。頁籤預設的位置在Android平台上是在標題列下,在iOS平台上則是最下方。頁籤的主要指令是<ion-tabs>,透過css設定頁籤是顯示圖示、文字或是兩者皆顯示,此處tabs-icon-top是文字與圖示同時顯示,且圖示在上方。每一個頁籤則是用<ion-tab>設定文字、圖示以及點選之後的連結頁面。
- angular.module('starter', ['ionic'])
- .config(function ($stateProvider, $urlRouterProvider) {
- $urlRouterProvider.otherwise('/home');
- $stateProvider
- .state('home', {
- url: '/home',
- templateUrl: 'home.html'
- })
- .state('order', {
- url: '/order',
- templateUrl: 'order.html'
- });
- })
- .run(function ($ionicPlatform) {
- ...略...
- })
- 第2行:.config()是用來設定UI-Router各個states的函式。UI-Router提供兩個services—$stateProvider用來定義狀態;$urlRouterProvider用來設定url對應關係,不過一般都用來呼叫.otherwise()設定app的首頁。
- 第3行:設定app的首頁url為"/home"。該url會定義在後續的states中。
- 第5-8行:以$stateProvider.state()定義頁面狀態。state用法是—state('名稱',{name1: value2, name2:value2})。故此處定義state名稱是'home';屬性url定義網址為'/home',網址亦為自訂;templateUrl則定義此頁面的內容來源,此處設定為home.html。
- 第9-12:以state定義第二個頁面,名稱是'order';屬性url定義網址為'/order',網址亦為自訂;templateUrl則定義此頁面的內容來源,此處設定為order.html。
底下是在JS Bin的執行結果:
用"text/ng-template"設定.html檔的內容
在這個範例裡值得注意的是:home.html以及order.html兩者其實不是真的「檔案」,而是透過<script>指令將內容寫在index.html檔內。<script id="home.html" type="text/ng-template"> ... </script>> <script id="order.html" type="text/ng-template"> ... </script>屬性id設定檔案名稱,該名稱在config內用來協助定義頁面state。type設定值為"text/ng-template",代表這是頁面內容。
將頁面寫在同一個檔案內對少數頁面apps而言很方便,但對頁面多的apps則不適合。下一個範例將重構程式碼,把每個頁面拆成單獨的檔案。
沒有留言:
張貼留言