顯示具有 Ionic教學 標籤的文章。 顯示所有文章
顯示具有 Ionic教學 標籤的文章。 顯示所有文章

2016年3月15日 星期二

Ionic App Views製作:ng指令與$scope變數

Ionic apps透過angular.module().config()設定每個頁面組態,以'templateUrl'指定頁面HTML檔所在,以'controller'指定該頁面對應的controller,例如下列程式碼便設定了'home' state的url、html檔所在位置、以及controller名稱:
//...
$stateProvider.state('home', {
                        url: '/home',
                        templateUrl: 'templates/home.html',
                        controller: 'HomeCtrl'
                    })
//...
然而,當要在頁面顯示一些動態資料-例如從資料庫讀取出來的內容、或是處理表單輸入的內容等動作時,還必須要靠「資料繫結」(data binding) 的輔助,才能更容易的達成目的。因此,AngularJS提供$scope變數,做為資料繫結之用。簡單的說,資料繫結(data binding)是指:先在controller中以$scope變數定義資料模型、或是函式,例如:
   $scope.name = {}; // 資料模型物件
   $scope.login = function() {
        // 函式主體
   }

2016年3月8日 星期二

Ionic App 程式結構之一:Views、Controllers、Configuration

如前文Hybrid Apps開發系列之2:第一個專案所說,Ionic專案建立之後,有app.js, index.html等重要檔案。事實上,Ionic apps有其運作機制,其中每一個app都會包括: views、controllers、與app設定(configuration)等部分,而視情況,還會建立services/factories,作為app資料服務串接之用。底下先就views、controllers、與app整體設定進行說明。

Ionic views、controllers與組態設定
Ionic apps有關views, controllers,組態設定(configuration)等基本運作機制,及其與index.html、app.js等檔案的關聯如下圖所示:

圖1. Ionic app的view(如home.html及page2.html)與controller(app.js)。index.html則做為app的模板(template)

2015年5月19日 星期二

Hybrid Apps開發系列之7.2:SideMenu側欄選單(Spotify歌曲試聽範例)

隨著Apps功能越來越豐富,為讓使用者能有較佳的介面操作體驗,通常會以「側欄選單」(sidemenu, 如圖) 的方式解決。
圖1. 側欄選單
「側欄選單」和「頁籤」(參考Hybrid Apps開發系列之4.4:多頁面App程式 (天氣app-非線上版))一樣都是屬於主頁面類型,實作時會將「側欄選單」所在頁面設定為parent state,其他頁面則共用「側欄選單」所在的parent state。

建立「側欄選單」


2015年5月13日 星期三

Hybrid Apps開發系列之6.3:使用Parse User實作雲端會員管理機制

[Parse.com服務已終止]延續前文Hybrid Apps開發系列之5.5:以REST API存取Parse雲端資料庫 ,本文繼續介紹Parse提供的會員管理機制:Parse User。透過此Parse內建的class,註冊、登入等會員基本管理,都非常簡單。

Parse User是Parse App內建的class,只要建立app,就會自動產生。Parse User class預設有9個欄位如下圖所示,視需求可自行擴充。
圖1. Parse app自動產生User class,內有username, password, email等欄位
以下以EnrollApp的雲端資料庫(如下圖)為例,說明如何以Parse REST API進行會員註冊與登入的動作。
圖2. EnrollApp雲端資料庫

2015年5月9日 星期六

Hybrid Apps開發系列之6.2:使用Google Maps API顯示地圖

地圖服務是行動apps最常提供的功能。本文介紹如何在Ionic Apps裡使用Google Maps API顯示地圖。
 圖1. 顯示Google Map

前置動作:產生Google API Key

Google API的使用方式如下:
http://maps.googleapis.com/maps/api/js?key=[你的API金鑰]&sensor=true
因此必須先取得API金鑰,步驟如下:
  1. 前往Google Developers Console (https://console.developers.google.com/)。
  2. 以gmail帳號登入後,點選「建立專案」,並輸入專案名稱。
  3. 進到專案頁面,選取左側選單「API和驗證」項目下的「API」,從右邊各種API列表中選取Google Maps JavaScript API,並在下一個畫面啟動之。
  4. 在「API和驗證」項目下的「憑證」頁面,點選「建立新的金鑰」,選擇「瀏覽器金鑰」,並輸入http:/localhost:8100/*。
  5. 將「API 金鑰」複製起來,放到index.html引用Google Maps API的地方,例如:
  6. <script src="http://maps.googleapis.com/maps/api/js?key=[你的API 金鑰]&sensor=true"></script>

2015年5月7日 星期四

Hybrid Apps開發系列之6.1:登入授權OAuth以Facebook為例

OAuth是一種讓第三方取得某用戶登入授權,進而存取該用戶在某網站上所擁有資源的開放標準。簡單說,目前各大網站例如Facebook, Google, Twitter等,都有OAuth登入授權機制,如果想在你的apps裡使用這些網站的資源,便需要實做OAuth。對Ionic Apps而言,OAuth登入授權可使用ngCordova OAuth外掛。該外掛支援Fackbook, Google, Dropbox, Twitter等許多網路服務登入授權,用法也很簡單。底下以Facebook登入授權為例,說明如何在Ionic Apps上取得Facebook內容。

Facebook前置作業:create Facebook App

以OAuth登入前,必須先在Facebook建立對應的App。步驟簡述如下:
  1. 登入FB,前往「管理應用程式」頁面(https://developers.facebook.com/)。
  2. 選取My Apps / Add a New App,接著在跳出的頁面裡選擇「WWW網站」類型。
  3. 圖1.App類型選擇WWW網站

2015年5月4日 星期一

Hybrid Apps開發系列之5.5:以REST API存取Parse雲端資料庫

[Parse.com服務已終止]SQLite是手機內建的資料庫,僅適合用來儲存local data。「資料庫伺服器」或是「網路資料庫服務」對許多apps而言,才是儲存資料的正解。因此,本文以Parse雲端資料庫服務為例,使用Parse REST API存取雲端資料庫。

前置作業(1/4):在parse.com建立App

透過API使用Parse雲端資料庫必須先在Parse.com註冊、建立App、並取得App Keys才能順利使用。Parse的帳號啟用之後,點選"Create a new App"建立App,切換到Dashboard,便可看到已經建立的所有Apps,如下圖:
圖1.Parse.com提供雲端資料庫服務

2015年5月3日 星期日

Hybrid Apps開發系列之5.4:表單輸入驗證 (Form validation)

表單輸入驗證 (form validation) 是資料寫入資料庫的第一道檢查關卡,程式必須確認使用者已經輸入必要的資料,且一切格式都符合要求。Ionic專案的表單輸入驗證是採用AngularJS的驗證機制,基本程式碼如下:

<form name="form" novalidate>帳號:
  <input type="text" name="user" ng-model="username" required  />
  <span ng-show="form.user.$error.required">帳號不得為空</span>

  <input ng-disabled="form.user.$dirty && form.user.$invalid" type="submit" />
</form>

  • 第1行:由於驗證結果(例如格式錯誤、未填寫等)必須透過表單存取,故必須設定name屬性,此處自訂表單的名稱為"form",供後續存取驗證結果。另外novalidate表示關閉browser內定的驗證機制,由AngularJS進行驗證。
  • 第2行:每個要做輸入驗證的欄位,都必須自訂name屬性值,此處自訂為"user",如為必要欄位,則必須設定required。
  • 第3行:驗證錯誤訊息。form.user代表第2行帳號填寫欄位。$error則是驗證結果出現錯誤。AngularJS內建了一些驗證程序,例如.requried會負責驗證有無填寫,因此使用$error.required代表未填寫。

2015年4月30日 星期四

Hybrid Apps開發系列之5.2:彈出式視窗$ionicModal運用於「資料編輯」

在進入更複雜的自訂Services範例之前,由於許多服務都牽涉到即時編輯與更新資料的功能,因此有必要先介紹適合用來編輯資料的「彈出式視窗」。Ionic「彈出式視窗」有兩類:$ionicModal與$ionicPopup。$ionicModal是完整頁面,以
<ion-modal-view></ion-modal-view>
建置頁面,$ionicPopup則是對話框 (dialog)式,直接用JavaScript設定對話框的一些餐數值,通常用於訊息通知、確認等作用。兩種彈出式視窗外觀如下圖所示。
圖1. 彈出式視窗有兩種:$ionicModal與$ionicPopup

2015年4月27日 星期一

Hybrid Apps開發系列之5.1:資料模型與自訂services(重構天氣app線上版)

Ionic/AngularJS apps透過$scope變數可以定義資料模型 (data model) 變數供前端頁面 (views)使用,而在controller端,則會將資料模型變數設定為數值、陣列甚至是透過web services得到的資料。然而,如果有資料處理、頁面共用資料模型等更複雜的運作方式時,應該呼叫.factory()採用「自訂services」的方式,將資料處理等相關程式碼打包進factory,供$scope以及前端頁面運用,如下圖所示:
圖1.各種資料來源可透過factory進行管理
如圖1,factory可將資料庫、web services、或是一般JavaScript物件包裹起來,建立資料處理服務,提供$scope與前端頁面使用。Factory就相當於apps的資料層 (data layer)。

Factory基本格式

Ionic/AngularJS模組都可建立factory,做為資料層,基本格式如下:
angular.module('starter',['ionic])
   .factory('serviceName',function(){
       return {}
   }
)

2015年4月24日 星期五

Hybrid Apps開發系列之4.6:多頁面App程式 (天氣app-線上即時版)

使用$http模組,可透過HTTP即時取得資料後,稍微修改Hybrid Apps開發系列之4.4:多頁面App程式 (天氣app-非線上版) 的離線版程式,便可改為線上即時版。

唯一要修改的是controllers.js,修改後如下:
angular.module('starter.controllers',[])
        .controller('homeCtrl',function($scope,$location){
            $scope.citys = citys;
            $scope.showWeather = function(index){                
                $location.path('/tab/home/'+index);
            }
        })
        .controller('settingsCtrl',function($scope){
            $scope.citys = citys;
        })          
        .controller('weatherCtrl', function ($scope, $stateParams, $http) {
            $scope.city = citys[$stateParams.id];
            $scope.img_base_url = image_base_url;
            $http.get('http://api.openweathermap.org/data/2.5/weather',
                    {params: {'q': $scope.city.q}})
                    .then(function (response) {
                        $scope.weather = response.data; 
                    }, function (err) {
                        alert("Error!!")
                    })
        })
var citys = [
    {name: "台北", q: "Taipei", on: true},
    {name: "台中", q: "Taichung", on: true},
    {name: "台南", q: "Tainan", on: true},
    {name: "高雄", q: "Kaohsiung", on: true},
    {name: "花蓮", q: "Hualian", on: true},
]
var image_base_url = "http://openweathermap.org/img/w/"; // open weather api icon

Hybrid Apps開發系列之4.5:以HTTP連線取得JSON資料

開放資料當道,許多都可透過HTTP連線方式取得JSON格式資料,前文Hybrid Apps開發系列之4.4:多頁面App程式 (天氣app-非線上版)便以open weather map,離線取得天氣資料。但如果要線上即使取得資料,則必須使用AngularJS的$http模組。

$http連線取得JSON資料

$http實際上是發出http要求,進而取得回應資料。如果格式是JSON,在JavaScript中便可直接使用,其他格式則不一定。

$http連線使用方式如下:
$http.get("http://url/service", { params: { "key1": "value1", "key2": "value2" } })
    .success(function(response) {
        // 處理http回應資料; response為回傳資料
    })
    .error(function(err) {
        // 連線錯誤
    });
另一種寫法則是:
$http.get("http://url/service", { params: { "key1": "value1", "key2": "value2" } })
    .then(function(response) {
        // 建立天氣資料模型變數,response.data為回傳資料
    }, function(err) {
        // 連線錯誤
    });
兩者有所差別,可參考此討論串。在此建議用
.then(function(resp),function(err))

2015年4月23日 星期四

Hybrid Apps開發系列之4.4:多頁面App程式 (天氣app-非線上版)

前文(Hybrid Apps開發系列之4.1:多頁面App製作與頁籤(Tabs)簡介)介紹的範例有許多codes重複出現,例如頁籤<ion-tabs>便同時出現在兩個.html檔內:

    <ion-tabs class="tabs-icon-top">
        <ion-tab href="/home" icon="ion-home" title="首頁"></ion-tab>
        <ion-tab href="/order" icon="ion-compose" title="訂位"></ion-tab>
    </ion-tabs>
此外,<ion-nav-bar>等指令也同樣重複出現。為了讓程式碼共用,必須採用「共用states」的方式。

共用states

UI-Router可定義abstract state-也就是操作過程中不能直接瀏覽的頁面-讓多個states共用;而abstract state是parent state;其他共用abstract state的頁面則為child states。因此,4.1的頁籤範例修改的部分如下圖所示。