Ionic2 开发总结

痛点在于开发环境吧,base app的下载和gradle编译都需要较好的外网环境

环境准备

  • npm install -g cordova ionic
  • ionic start myApp --v2 --skip-npm,这一步是从git上拉取项目模板,内网环境下是无法下下来的, --v2是下载ionic2版本, --skip-npm是因为下完模板后ionic会自动npm install,跳过这部然后自己手动用cnpm下载
  • cd myApp
  • ionic serve -lc,ionic提供的浏览器调试,一开始一直不成功。多次新建项目下载重试后,成功...还是网络不稳定导致的吧,-lc是ionic lab,该页面可以同时调试在Android、IOS和WP设备上的样式;
  • ionic platform add android,添加android平台下的项目结构,在platforms文件夹下。
  • ionic build android, ionic run android -lc,编译和在真机上运行,-lc类似serve下的-lc,可以实时在真机上调试;

gradle 配置

  • ionic build android是通过gradle编译,而且会在线下载gradle,墙内基本是下不了的,这就需要手动下载项目需要的gradle版本。 查看android platform下的build.gradle文件,看当前版本需要的gradle version。 下载成功后,放在myApp\platforms\android\gradle文件夹下, 命令行输入set CORDOVA_ANDROID_GRADLE_DISTRIBUTION_URL=../gradle-2.14.1-all.zip
  • maven下载失败问题。替换为阿里云镜像:
    打开项目\platforms\android\build.gradle修改:
repositories {
//mavenCentral() // 注释掉
jcenter()
flatDir {
dirs 'libs'
}
maven {
url "http://maven.aliyun.com/nexus/content/groups/public"
}
}

Ionic2 使用

  • Ionic2添加页面模板
    ionic g page xxx

  • 页面跳转
    引入 import {NavController} from 'ionic-angular'
    在类中通过push和pop方法跳转或返回上个页面:
    this.navCtrl.push(demoPage);
    this.navCtrl.pop()

  • 页面间的参数传递
    引入import {NavParams} from 'ionic-angular'
    跳转时传入参数: this.navCtrl.push(demoPage, {item: 'value'})
    跳转后的页面通过get方法获取值: let temp = this.navParams.get('item')

  • select/radioGroup的默认选择问题
    官方文档中给出的方法是在html中使用属性selected="true"/ checked="true";
    目前来看该方法不起作用,查看issue,发现需通过ngModel绑定变量,设定变量的初始值。

  • 搜索框

<ion-searchbar (ionInput)="getItems($event)"></ion-searchbar>
<ion-list>
  <ion-item *ngFor="let item of items">
    {{ item }}
  </ion-item>
</ion-list>

@Component({
  templateUrl: 'search/template.html',
})
class SearchPage {

  searchQuery: string = '';
  items: string[];

  constructor() {
    this.initializeItems();
  }

  initializeItems() {
    this.items = [
      'Amsterdam',
      'Bogota',
      ...
    ];
  }

  getItems(ev: any) {
    // Reset items back to all of the items
    this.initializeItems();

    // set val to the value of the searchbar
    let val = ev.target.value;

    // if the value is an empty string don't filter the items
    if (val && val.trim() != '') {
      this.items = this.items.filter((item) => {
        return (item.toLowerCase().indexOf(val.toLowerCase()) > -1);
      })
    }
  }
}
  • ionic2页面切换数据不刷新
    在tabs模板下,切换页面,初始化的方法只会执行一次,但一些动态从服务器获取的数据是希望每次进入页面时都重新获取刷新的,这就需要对ionic的页面生命周期有一定了解,可以将数据请求刷新的方法放在ionViewWillEnter中。ionic2的生命周期如下:
事件名称 事件说明
ionViewDidLoad 页面加载完毕触发。该事件发生在页面被创建成 DOM 的时候,且仅仅执行一次。如果页面被缓存(Ionic默认是缓存的)就不会再次触发该事件。该事件中可以放置初始化页面的一些事件。
ionViewWillEnter 即将进入一个页面变成当前激活页面的时候执行的事件。
ionViewDidEnter 进入了一个页面且变成了当前的激活页面,该事件不管是第一次进入还是缓存后进入都将执行。
ionViewWillLeave 将要离开了该页面之后变成了不是当前激活页面的时候执行的事件。
ionViewDidLeave 在页面完成了离开该页面并变成了不是当前激活页面的时候执行的事件。
ionViewWillUnload 在页面销毁和页面中有元素移除之前执行的事件。
ionViewDidUnload 在页面销毁和页面中有元素移除之后执行的事件
  • 阻止点击事件传递方法
    (click)="do(); $event.stopPropagation()"

  • 修改应用图标和启动画面

    1. 找到合适的图标文件,png格式
    2. 替换项目resources文件夹下的icon.png
    3. 项目路径下运行ionic resources命令,该命令为所有platform生成对应分辨率的图片
    4. 若想针对不同platform使用不同图标,图片复制到resources下对应platform文件夹下,再运行ionic resources

ionic resources对应的服务似乎不太稳定,也可以通过在线网站图标工厂

  • 修改应用名称
    修改根目录下config.xml文件:
    <widget id="com.ionframework.demo">,id对应应用的包名
    <name></name>对应应用名称,直接修改Android的values文件没有效果

  • 解决Splash后出现短暂白屏问题
    修改config.xml
    添加 <preference name="AutoHideSplashScreen" value="false"/>
    注释掉 <preference name="SplashScreenDelay" value="3000"/>

  • 关于crosswalk
    crosswalk是针对安卓设备的一个webview插件,性能较好,目前ionic2的demo里不会自带crosswalk。官方的说法是它们发现只有在低于4.x.x的安卓系统上,ionic应用运行性能不稳定,而4.x.x的设备在Google的统计里,全球只有不到11%。

Angular2双向绑定

ngModule

<ion-input type="text", [(ngModule)]="inputTN"></ion-input>

ts文件中
private inputTN;
let tn = this.inputTN;

需要先定义变量名。

Angular2依赖注入

在自定义了一个http服务类后,页面中引用方法报错,原因是没有给服务类添加注解@Injectable()@Injectable()标志着一个类可以被一个注入器实例化;通常来讲,在试图实例化一个没有被标识为@Injectable()的类时候,注入器将会报告错误

Ionic2引入第三方js库

应用中想实现一个页面,进入时显示根据设备uuid生成的二维码,虽然barcodescanner可以实现生成二维码,但会打开一个Activity,这样体验不符合需求。于是想到引用第三方的js库,如qrcode.js等。
然而Ionic2使用typescript,ts中是无法直接调用js的。这里网上给出了两种方案。

  1. 引入js文件,通过declarations.d.ts文件声明引用变量。
  2. 通过types库下载qrcode。

方案2并没有成功,方案1的具体过程以qrcode为例,如下:

  1. 从github下在需要的js文件,jquery.min.jsqrcode.js
  2. 文件复制到项目'/src/assets/js'目录下,js目录是自己新建的
  3. 在index.html中引入:
    <script src="assets/js/jquery.min.js"></script> <script src="assets/js/qrcode.min.js"></script>
  4. 在src目录下的declarations.d.ts中申明qrcode的方法变量:
    declare var QRCode;
  5. 完成以上步骤后,就可以在ts中调用qrcode的方法,例如在页面上显示一个文本转换的二维码:
    <div id="qrImage" class="qrcode-image"></div>
    let qrImage = document.getElementById('qrImage'); new QRCode(qrImage, 'test');

获取设备分辨率

window.screen.width * window.devicePixelRatio; window.screen.height * window.devicePixelRatio;

隐藏滚动条

发现在部分设备上会显示滚动条,解决方法:修改app.sccs,添加如下代码:

::-webkit-scrollbar {  
  display: none !important;  
}  

编译

ionic build android --prod --release, --prod是压缩模式,编译出来的app启动速度变快,减少splash时间
--release是签名打包,具体可见Ionic2 安卓签名打包;
Ios有一特殊的地方,正常编译出来的都是.app文件,需要导入ITouch中生成ipa。后来发现,使用ionic run ios --prod安装到真机时,/ios/build/下会多出device目录,该目录下有现成ipa,省去iTouch这一步。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容