![]() |
圖1. 左邊是清單,點選項目後會出現該項目細節 |
為了讓頁面傳遞參數,Ionic/AngularJS提供了$stateParams服務,透過此服務,搭配.config() states內的url設定,就能將參數傳遞到下一個頁面,如下圖:
![]() |
圖2. 透過$stateParams服務,同時正確設定state的url格式,便可傳遞參數。 |
因此,圖1所構成的瀏覽模式,其app.js如下:
最後,記得在index.html加入controllers.js檔:
- angular.module('starter', ['ionic','starter.controllers'])
- .config(function($stateProvider, $urlRouterProvider){
- $urlRouterProvider.otherwise('/home');
- $stateProvider
- .state('home',{
- url: '/home',
- templateUrl: 'templates/home.html',
- controller: 'homeCtrl'
- })
- .state('details',{
- url: '/home/:sid',
- templateUrl: 'templates/details.html',
- controller: 'detailsCtrl'
- })
- })
states說明
- 第1行:starter模組的相依參數部份,除了ionic模組外,多了自訂模組'starter.controllers',這是因為將所有controllers都放到另一個.js檔的緣故。
- 第11行:'details'這個state的url必須加入傳遞參數的名稱,例如sid,格式則是':參數名稱',如範例所示 ':sid'。
controllers.js檔案內容如下:
- angular.module('starter.controllers',[])
- .controller('homeCtrl',function($scope){
- $scope.stocks = stocklist;
- })
- .controller('detailsCtrl',function($scope,$stateParams){
- $scope.stock = stocklist[$stateParams.sid];
- })
- var stocklist = [
- {id: 2330, name: '台積電', price: 147.0, PER: 14.44, PBR: 3.65,
- yield: 3.06, Desc: '晶圓製造'},
- {id: 1301, name: '台塑', price: 76.5, PER: 27.03, PBR: 1.7,
- yield: 2.22, Desc: '聚氯乙烯(PVC)、氯乙烯等塑膠製品'},
- {id: 2002, name: '中鋼', price: 25.8, PER: 18.04, PBR: 1.33,
- yield: 3.88, Desc: '鋼品設計製造買賣儲運及其他相關業務'},
- {id: 3045, name: '台灣大', price: 108.0, PER: 19.42, PBR: 6.13,
- yield: 5.19, Desc: '通訊業'},
- {id: 2454, name: '聯發科', price: 421.5, PER: 14.03, PBR: 2.68,
- yield: 3.56, Desc: '多媒體IC 、電腦週邊IC、其他IC'},
- {id: 2317, name: '鴻海', price: 93.1, PER: 10.52, PBR: 1.48,
- yield: 1.93, Desc: '電腦系統設備連接器等之開發設計製造'},
- {id: 3008, name: '大立光', price: 2695.0, PER: 18.6, PBR: 7.83,
- yield: 1.06, Desc: '各式光學鏡頭模組研發設計生產銷售'}
- ]
controllers說明
- 第1行:定義controller模組,名稱為"starter.controllers",必須與app.js指定的名稱相符。
- 第2-4行:定義homeCtrl,以$scope定義資料模型變數stocks,供頁面home.html使用,其值為8-23行的資料陣列。
- 第5-7行:定義detailsCtrl,供details.html使用。由於要接收home頁面傳送過來的參數,因此,必須使用$stateParams服務。而$stateParams.sid便是傳送過來的參數。此外,也定義了stock資料模型變數,其值為根據傳送過來的參數值,所對應的陣列元素。
- 第8-23行:資料陣列。Ionic/AngularJS有其他服務可從網路中取得資料。後續範例會將資料部份改為從網路擷取。
頁面說明
清單列表頁面home.html如下:
- <ion-view title="清單">
- <ion-nav-bar>
- </ion-nav-bar>
- <ion-content>
- <div class="list">
- <div class="item" ng-repeat="item in stocks">
- <a href="#/home/{{$index}}">{{item.id}} {{item.name}}</a>
- </div>
- </div>
- </ion-content>
- </ion-view>
- 第6行:ng-repeat指令重複產生6-8行的div,內容部份則是靠controller端$scope定義的資料模型陣列變數stocks,將資料綁定至頁面來。
- 第7行:每一清單項目以超連結的方式設定url。其中'#/home/'是基本網址,$index則是陣列stocks的索引值,由0開始編號。
細節瀏覽頁面details.html如下:
- <ion-view title="{{stock.name}}">
- <ion-nav-bar>
- <ion-nav-back-button></ion-nav-back-button>
- </ion-nav-bar>
- <ion-content>
- <div class="list card">
- <div class="item item-icon-left">
- <i class="icon ion-podium"></i>
- <h2>{{stock.id}}{{stock.name}}</h2>
- <p>{{stock.Desc}}</p>
- </div>
- <div class="item item-body">
- <div class="row">
- <div class="col">股價<br>{{stock.price}}</div>
- <div class="col">本益比<br>{{stock.PER}}</div>
- </div>
- <div class="row">
- <div class="col">股價淨值比<br>{{stock.PBR}}</div>
- <div class="col">殖利率<br>{{stock.yield}}%</div>
- </div>
- </div>
- </div>
- </ion-content>
- </ion-view>
- 第6-22行參考Ionic官網的Card Showcase範例,以及Hybrid Apps開發系列之3.4:單頁面App製作(貨幣轉換器)曾經介紹過col, row兩個CSS class,將個股的各個屬性值排列出來。
最後,記得在index.html加入controllers.js檔:
[...略...] <!-- your app's js --> <script src="js/app.js"></script> <script src="js/controllers.js"></script> </head> <body ng-app="starter"> <ion-nav-view></ion-nav-view> </body> </html>
JS Bin線上展示如下:
沒有留言:
張貼留言