圖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線上展示如下:JS Bin
沒有留言:
張貼留言