VS2015 Cordova Ionic移動開發(五)

一、創建側邊菜單和導航項目

1.使用VS創建一個Ionic空項目,同時創建一個Ionic SideMenu和Ionic Tabs項目。將SideMenu和Tabs項目里的templates和js文件合并到空項目里,修改js對應的代碼即可。完整項目工程如下:

image

2.App.js代碼修改如下:

/** 加載所需要的各個模塊* 上篇教程中加載了controllers控制器模塊* 本篇教程加載了services服務模塊*/
angular.module('starter', ['ionic', 'starter.controllers', 'starter.services'])
.run(function ($ionicPlatform) {$ionicPlatform.ready(function () {if (cordova.platformId === 'ios' && window.cordova && window.cordova.plugins.Keyboard) {cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);cordova.plugins.Keyboard.disableScroll(true);}if (window.StatusBar) {StatusBar.styleDefault();}});
})
.config(function ($stateProvider, $urlRouterProvider, $ionicConfigProvider) {//用來配置各個平臺導航條樣式(統一導航條位置)$ionicConfigProvider.platform.ios.tabs.style('standard');$ionicConfigProvider.platform.ios.tabs.position('bottom');$ionicConfigProvider.platform.android.tabs.style('standard');$ionicConfigProvider.platform.android.tabs.position('standard');$ionicConfigProvider.platform.ios.navBar.alignTitle('center');$ionicConfigProvider.platform.android.navBar.alignTitle('left');$ionicConfigProvider.platform.ios.backButton.previousTitleText('').icon('ion-ios-arrow-thin-left');$ionicConfigProvider.platform.android.backButton.previousTitleText('').icon('ion-android-arrow-back');$ionicConfigProvider.platform.ios.views.transition('ios');$ionicConfigProvider.platform.android.views.transition('android');//配置路由
    $stateProvider.state('app', {url: '/app',abstract: true,templateUrl: 'templates/menu.html',controller: 'AppCtrl'}).state('app.search', {url: '/search',views: {'menuContent': {templateUrl: 'templates/search.html'}}}).state('app.browse', {url: '/browse',views: {'menuContent': {templateUrl: 'templates/browse.html'}}}).state('app.playlists', {url: '/playlists',views: {'menuContent': {templateUrl: 'templates/playlists.html',controller: 'PlaylistsCtrl'}}}).state('app.single', {url: '/playlists/:playlistId',views: {'menuContent': {templateUrl: 'templates/playlist.html',controller: 'PlaylistCtrl'}}}).state('app.tab', {url: '/tab',abstract: true,views: {'menuContent': {templateUrl: 'templates/tabs.html'}}}).state('app.tab.dash', {url: '/dash',views: {'tab-dash': {templateUrl: 'templates/tab-dash.html',controller: 'DashCtrl'}}}).state('app.tab.chats', {url: '/chats',views: {'tab-chats': {templateUrl: 'templates/tab-chats.html',controller: 'ChatsCtrl'}}}).state('app.tab.chat-detail', {url: '/chats/:chatId',views: {'tab-chats': {templateUrl: 'templates/chat-detail.html',controller: 'ChatDetailCtrl'}}}).state('app.tab.account', {url: '/account',views: {'tab-account': {templateUrl: 'templates/tab-account.html',controller: 'AccountCtrl'}}});$urlRouterProvider.otherwise('/app/tab/dash');
});

controllers.js和services.js文件這里就不貼代碼了,因為不涉及到關鍵代碼的講解。

3.修改menu.html內容,注意注釋說明部分

<ion-side-menus enable-menu-with-back-views="false"><ion-side-menu-content><ion-nav-bar class="bar-stable"><ion-nav-back-button></ion-nav-back-button><ion-nav-buttons side="left"><button class="button button-icon button-clear ion-navicon" menu-toggle="left"></button></ion-nav-buttons></ion-nav-bar><ion-nav-view name="menuContent"></ion-nav-view></ion-side-menu-content><ion-side-menu side="left"><ion-header-bar class="bar-stable"><h1 class="title">Left</h1></ion-header-bar><ion-content><ion-list><!--這里去掉menu-close屬性,改成menu-toggle="left",不然使用返回鍵退出菜單時會自動關閉視圖,從而導致應用程序退出。--><ion-item ng-click="login()" menu-toggle="left">Login</ion-item><ion-item href="#/app/search" menu-toggle="left">Search</ion-item><ion-item href="#/app/browse" menu-toggle="left">Browse</ion-item><ion-item href="#/app/playlists" menu-toggle="left">Playlists</ion-item></ion-list></ion-content></ion-side-menu>
</ion-side-menus>

4.最終預覽效果如下

Animation

左邊側滑菜單打開后,怎么在Ripple模擬器中使用返回鍵來退出菜單到主界面:

image

在Ripple的Events菜單中選擇回退按鈕,點擊FireEvent即可模擬點擊返回鍵。

?

二、路由和視圖詳解

1.視圖加載順序

在index.html中有一個主視圖的標簽:

<ion-nav-view></ion-nav-view>

在menu.html中一個menu內容的視圖標簽:

<ion-nav-view name="menuContent"></ion-nav-view>

在選項卡tabs.html中有3個視圖標簽:

<ion-tabs class="tabs-icon-top tabs-color-active-positive"><!--重新設置路由--><ion-tab title="Status" icon-off="ion-ios-pulse" icon-on="ion-ios-pulse-strong" href="#/app/tab/dash"><ion-nav-view name="tab-dash"></ion-nav-view></ion-tab><!--重新設置路由--><ion-tab title="Chats" icon-off="ion-ios-chatboxes-outline" icon-on="ion-ios-chatboxes" href="#/app/tab/chats"><ion-nav-view name="tab-chats"></ion-nav-view></ion-tab><!--重新設置路由--><ion-tab title="Account" icon-off="ion-ios-gear-outline" icon-on="ion-ios-gear" href="#/app/tab/account"><ion-nav-view name="tab-account"></ion-nav-view></ion-tab>
</ion-tabs>

我們需要在程序啟動時,加載第一個標簽選項卡內容(tab-dash.html)、標簽選項卡(tabs.html)、左側菜單(menu.html)

視圖的渲染方式:

首先將tab-dash.html喧渲染到tabs.html的<ion-nav-view name="tab-dash"></ion-nav-view>

其次將tabs.html渲染到menu.html的<ion-nav-view name="menuContent"></ion-nav-view>

最后將menu.html渲染到index.html

視圖切換方式:

在點擊menu.html中的菜單項時,會把菜單項所對應的頁面重新渲染到<ion-nav-view name="menuContent"></ion-nav-view>上覆蓋原來的標簽選項卡視圖,這樣在顯示區域就會顯示從菜單打開的視圖了。如果需要返回到之前的標簽選項卡視圖,只需使用返回按鈕就行了。導航視圖的作用就在于可以使用返回按鈕在各層視圖時間切換實現導航作用。

?

2.狀態繼承和激活順序

在上述視圖加載時需要用到如下狀態:

dash狀態:

.state('app.tab.dash', {url: '/dash',views: {'tab-dash': {templateUrl: 'templates/tab-dash.html',controller: 'DashCtrl'}}})
tab狀態:
.state('app.tab', {url: '/tab',abstract: true,views: {'menuContent': {templateUrl: 'templates/tabs.html'}}})

app狀態:

.state('app', {url: '/app',abstract: true,templateUrl: 'templates/menu.html',controller: 'AppCtrl'})

狀態繼承:

在AngularJs中狀態繼承使用:app.tab.dash,訪問路徑相對也是繼承的:#/app/tab/dash

每個狀態之間使用 . 隔開。父級狀態可以聲明為abstract:true。當abstract為true時,父級狀態默認不激活,只有當子狀態被激活時,父級狀態才被激活。

激活狀態代碼如下:

$urlRouterProvider.otherwise('/app/tab/dash');

該代碼的作用就是默認激活:app.tab.dash狀態。由于app.tab.dash狀態從app.tab繼承的,并且app.tab為abstract,所以app.tab.dash激活時同時會激活app.tab。同理,app是app.tab的父級狀態并且為abstract,所以當app.tab被激活時,會同時激活app狀態。

也就是說該代碼同時激活了3個狀態分別為:app.tab.dash、app.tab、app 。這3個狀態分別對應tab-dash.html選項卡內容頁、tabs.html選項卡頁面、menu.html菜單頁面。所以最終顯示成預覽的效果。

Ionic開發中一個難點就在于怎么使用路由控制視圖的顯示。各個路由(狀態)的激活順序,以及視圖的加載順序都尤為重要。不然就要走很多彎路。比如上述案例,有另外幾種做法,要么是把menu.html內容往各個視圖里粘貼,要么就是把tabs.html內容往各個內容頁粘貼。這種實現方式理論上都可以,但是效率不高,維護起來麻煩。充分利用好狀態的繼承關系,合理的安排視圖布局,是做好Ionic開發的基礎。

?

三、導航條設置

由于Ionic的導航條在IOS和Android呈現的位置不一致,所以使用以下代碼來讓導航條在各個平臺上顯示一致:

//用來配置各個平臺導航條樣式(統一導航條位置)$ionicConfigProvider.platform.ios.tabs.style('standard');$ionicConfigProvider.platform.ios.tabs.position('bottom');$ionicConfigProvider.platform.android.tabs.style('standard');$ionicConfigProvider.platform.android.tabs.position('standard');$ionicConfigProvider.platform.ios.navBar.alignTitle('center');$ionicConfigProvider.platform.android.navBar.alignTitle('left');$ionicConfigProvider.platform.ios.backButton.previousTitleText('').icon('ion-ios-arrow-thin-left');$ionicConfigProvider.platform.android.backButton.previousTitleText('').icon('ion-android-arrow-back');$ionicConfigProvider.platform.ios.views.transition('ios');$ionicConfigProvider.platform.android.views.transition('android');

?

結束語:以上是一個簡單的整合案例,實現了側滑菜單和導航。詳細的代碼請下載源碼附件。

示例代碼

轉載于:https://www.cnblogs.com/UltimateAvalon/p/5354542.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396407.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396407.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396407.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

最佳適應算法和最壞適應算法_算法:好,壞和丑陋

最佳適應算法和最壞適應算法by Evaristo Caraballo通過Evaristo Caraballo 算法&#xff1a;好&#xff0c;壞和丑陋 (Algorithms: The Good, The Bad and The Ugly) Who has been in Free Code Camp without having the experience of spending hours trying to solve Algori…

mysql條件觸發器實例_mysql觸發器實例一則

例子&#xff0c;實例學習mysql觸發器的用法。一&#xff0c;準備二張測試表&#xff1a;1&#xff0c;測試表1復制代碼 代碼示例:DROP TABLE IF EXISTS test;CREATE TABLE test (id bigint(11) unsigned NOT NULL AUTO_INCREMENT,name varchar(100) NOT NUL…

阿里大數據神預測 勝率僅5.9%中國卻1:0勝韓國

寫在最前面&#xff1a;這是早晨偶然看到的一篇文章&#xff0c;是對昨天中國卻1&#xff1a;0勝韓國的評論。有朋友感慨&#xff1a;努力不放棄的時候&#xff0c;全世界都會幫你。這篇內容很全面的串起阿里巴巴在大數據預測方面的動作&#xff0c;角度很別致&#xff0c;分享…

Python中類、對象與self詳解

先介紹一下python中的類與對象/實例。然后詳細說明self。說明&#xff1a;對象等同實例&#xff0c;本文稱呼不一致時請自行統一 【一】類與對象/實例 1、類 &#xff08;1&#xff09;類由名稱、屬性、方法三部分組成 &#xff08;2&#xff09;類是抽象模板&#xff0c;比如學…

面試題28 字符串排列

題目描述 輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。 結果請按字母順序輸出。 輸入描述: 輸入一個字符串,長度不超過9(可能有字符重復),字符只包括大小寫字母。 1 cla…

javascript 框架_克服JavaScript框架疲勞

javascript 框架by Tero Parviainen通過Tero Parviainen 克服JavaScript框架疲勞 (Overcoming JavaScript Framework Fatigue) The JavaScript community is suffering from a wave of framework fatigue. It’s caused by the massive outpouring of new frameworks, techniq…

java開發環境:還在配classpath?你out啦!

2019獨角獸企業重金招聘Python工程師標準>>> 先說結論&#xff1a;只需要配置JAVA_HOME和path路徑即可&#xff0c;無需配置classpath 參考Oracle官網的說明&#xff1a; The class path tells JDK tools and applications where to find third-party and user-defi…

qpython3可以調用哪些庫_Python3 如何使用asyncio庫在調用第三方模塊(存在IO等待)的情況下實現協程?...

問題描述demo中有一個 task_check 的模塊,底層是用urllib實現,請問如果要實現使用 asyncio 庫實現協程操作,需要修改這個模塊的底層代碼嗎?如何修改? 往大佬指點問題出現的環境背景及自己嘗試過哪些方法平時都是使用 gevent 庫和 monkey.patch_all() 實現協程,但發現 gevent …

.Net Core 商城微服務項目系列(二):使用Ocelot + Consul構建具備服務注冊和發現功能的網關...

1.服務注冊 在上一篇的鑒權和登錄服務中分別通過NuGet引用Consul這個包&#xff0c;同時新增AppBuilderExtensions類&#xff1a; public static class AppBuilderExtensions{public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app,IApplicationLife…

java打印數組_Java中打印數組內容的方式有哪些?

下面是幾種常見的打印方式。方法一&#xff1a;使用循環打印。public class Demo {public static void main(String[] args) {String[] infos new String[] {"Java", "Android", "C/C", "Kotlin"};StringBuffer strBuffer new Strin…

$(function() {})

$(function() {});是$(document).ready(function(){ })的簡寫&#xff0c; 最早接觸的時候也說$(document).ready(function(){ })這個函數是用來取代頁面中的window.onload; 用來在DOM加載完成之后執行一系列預先定義好的函數。

恢復工具

EasyRecovery http://www.upantool.com/hfxf/huifu/2011/EasyRecovery_V6.22.html轉載于:https://www.cnblogs.com/cb168/p/5359133.html

四參數坐標轉換c++_GPSRTK坐標轉換及四參數、七參數適用條件

工程測量儀器已由經緯儀、全站儀過渡到GNSS(全球衛星導航系統)&#xff0c;特別是公路行業&#xff0c;GPS-RTK作為GNSS的一種應用目前已十分普及。現階段GPS-RTK以WGS-84 坐標系統為主流&#xff0c;所發布的星歷參數也是基于此坐標系統&#xff0c;但隨著北斗導航系統的逐步完…

教主的魔法

傳送門 這道題序列很長&#xff0c;但是操作數很少&#xff0c;然后也沒想到什么好的數據結構來維護&#xff0c;那就分塊吧。 感覺維護的過程很好想&#xff0c;修改的時候對于整個塊都在內的直接打標記&#xff0c;兩個零散的區間暴力重構&#xff0c;重新排序。查詢的時候&a…

obs自定義編碼設置_通過7個步驟設置OBS進行實時編碼

obs自定義編碼設置by Wesley McCann韋斯利麥肯(Wesley McCann) 通過7個步驟設置OBS進行實時編碼 (Setting up OBS for Live Coding in 7 Steps) Twitch TV is a popular live-streaming service. You traditionally used Twitch to stream yourself playing video games, but …

java hadoop api_Hadoop 系列HDFS的Java API( Java API介紹)

HDFS的Java APIJava API介紹將詳細介紹HDFS Java API&#xff0c;一下節再演示更多應用。Java API 官網如上圖所示&#xff0c;Java API頁面分為了三部分&#xff0c;左上角是包(Packages)窗口&#xff0c;左下角是所有類(All Classes是)窗口&#xff0c;右側是詳情窗口。這里推…

最大連通子數組

這次是求聯通子數組的求和&#xff0c;我們想用圖的某些算法&#xff0c;比如迪杰斯特拉等&#xff0c;但是遇到了困難。用BFS搜索能達到要求&#xff0c;但是還未能成功。 那么我們這樣想&#xff0c;先將每行的最大子數組之和&#xff0c;然后再將這些最大之和組成一個數組&a…

redis的zset的底層實現_Redis(三)--- Redis的五大數據類型的底層實現

1、簡介Redis的五大數據類型也稱五大數據對象&#xff1b;前面介紹過6大數據結構&#xff0c;Redis并沒有直接使用這些結構來實現鍵值對數據庫&#xff0c;而是使用這些結構構建了一個對象系統redisObject&#xff1b;這個對象系統包含了五大數據對象&#xff0c;字符串對象(st…

科學計算機簡單編程_是“計算機科學”還是“編程”?

科學計算機簡單編程by Sam Corcos由Sam Corcos 是“計算機科學”還是“編程”&#xff1f; (Is It “Computer Science” or “Programming”?) 教育政策白皮書(提示&#xff1a;它們不是同一個東西) (An education policy white paper (hint: they’re not the same thing))…

[Matlab] 畫圖命令

matlab畫圖命令&#xff0c;不定時更新以便查找 set(gcf, color, [1 1 1]);     % 使圖背景為白色 alpha(0.4);           %設置平面透明度 plot(Circle1,Circle2,k--,linewidth,1.25);  % k--設置線型  ‘linewidth’,1.25  設置線寬度為1.25 %線型   …