ionic3搭建开发/测试环境

2018/10/25ionic 标签:0

用IONIC3很久了,但是一直没有看到IONIC3官方的相关文档有写关于开发、测试环境的建立或者设置,由此网上找了一番,小牛试刀终于成功搭建了测试和开发环境了,下面来分享一下相关代码与配置。
首先在src目录下创建一个config目录,建立三个文件,分别是webpack.config.js、environment.prod.ts、environment.dev.ts

webpack.config.js中的代码如下:

var path = require('path');
var useDefaultConfig = require('@ionic/app-scripts/config/webpack.config.js');

module.exports = function () {
    useDefaultConfig[process.env.IONIC_ENV].resolve.alias = {
        '@environment': path.resolve(__dirname + '/environment.' + process.env.IONIC_ENV + '.ts'),
    };
    return useDefaultConfig;
};

阅读更多

ionic2、3双击硬件back按键退出应用

2018/10/24ionic 标签:0

在手机设备上,经常可以看到双击手机上的返回键两次,就会提示是否要退出应用,关于官方的相关文档在这里:https://ionicframework.com/docs/api/platform/Platform/,大家可以看一下platform.registerBackButtonAction的使用方法,在ionic中的使用方式如下:
1、在src/app/app.component.ts中输入一下代码,或者自行改造一下

import { Component, ViewChild } from '@angular/core';
import { Platform, ToastController, Nav } from 'ionic-angular';
import { StatusBar, Splashscreen } from 'ionic-native';
import { TabsPage } from '../pages/tabs/tabs';
@Component({
  templateUrl: 'app.html'
})
export class MyApp {
  rootPage = TabsPage;
  backButtonPressed: boolean = false;  //用于判断返回键是否触发
  @ViewChild(Nav) nav: Nav;
  constructor(public platform: Platform, public toastCtrl: ToastController) {
    this.initializeApp();
  }
  initializeApp() {
    this.platform.ready().then(() => {
      StatusBar.styleDefault();
      Splashscreen.hide();
      //注册返回按键事件
      this.platform.registerBackButtonAction((): any => {
        let activeVC = this.nav.getActive();
        let page = activeVC.instance;
        //当前页面非tab栏
        if (!(page instanceof TabsPage)) {
          if (!this.nav.canGoBack()) {
            return this.showExit();
          }
          return this.nav.pop();
        }
        let tabs = page.tabs;
        let activeNav = tabs.getSelected();
        if (!activeNav.canGoBack()) {
          //当前页面为tab栏,退出APP
          return this.showExit();
        }
        //当前页面为tab栏的子页面,正常返回
        return activeNav.pop();
      }, 101);
    });
  }
  //双击退出提示框,这里使用Ionic2的ToastController
  showExit() {
    if (this.backButtonPressed) this.platform.exitApp();  //当触发标志为true时,即2秒内双击返回按键则退出APP
    else {
      let toast = this.toastCtrl.create({
        message: '再按一次退出应用',
        duration: 2000,
        position: 'bottom'
      });
      toast.present();
      this.backButtonPressed = true;
      //2秒内没有再次点击返回则将触发标志标记为false
      setTimeout(() => {
        this.backButtonPressed = false;
      }, 2000)
    }
  }
}

阅读更多

VMware安装Mac OS High Sierra 10.12及高版本无法全屏

好久没有玩VMware了,最近使用它安装了个Mac OS High Sierra 10.12,我一直尝试在macbook上按照网上的方法将mac系统转换成相应的iso镜像,但是并没有成功安装,最终在网上找到一个叫macOS 10.12 Sierra Final by TechReviews的压缩包,此压缩包包含的并不是iso镜像,而直接是VMware的一个已经安装了macOS 10.12 Sierra的虚拟硬盘vmdk文件,使用VMware创建虚拟机的使用不用创建新的硬盘,直接选择这个.vmdk文件作为硬盘即可。下载地址可以到我分享的网盘内下载,下载后解压即可:

百度网盘:https://pan.baidu.com/s/1eCNLN3AfIjUk2-kghfbFpQ 提取码:ov5c

使用VMware安装前,请先解锁一下VMware,让其可以安装Apple Mac OS,到github上下载最新版的unlocker进行安装(没有使用过github的同学,直接点击右边的clone or download进行下载),

地址:https://github.com/DrDonk/unlocker

不过有个缺点,就是这个虚拟硬盘大小仅有80G,目前并没有找到扩充的方法,如果大家有什么方法可以提供一下,非常感谢!先住院说一下无法全屏的问题以及原因。
只要以上一切准备就绪后,你就可以启动你的VMware虚拟机啦,接着就可以看到熟悉的苹果标志,然后跟着提示一直往下走就安装完成啦。
安装完成后就算你安装了VMware tools也无法全屏,就算你根据网上的说法,到虚拟机中设置一下屏幕,也是无济于事啊。其实最主要的原因是因为14版本的VMware中的VMware tools并不能支持mac os全屏,不过之前的VMware tools版本可以支持。因此大家可以去下载VMware tools 8.5.8就可以完美全屏啦。可以到这里下载:

百度网盘:https://pan.baidu.com/s/1EoUyGlaD_PEH2mEFKAJA-g 提取码:s7s9

采用XMLHttpRequest验证URL是否有效

有时候在处理某些URL时,可能会遇到404等情况,比如我们在国内使用谷歌地图api一样,我们在请求的时候可能会发生404问题,这个时候我们又想去判断下当前url为404的话,我们则采用其他地图的api,当然我这里所说的仅仅只是一个使用场景,可能你也会遇到其他更多场景,并且也需要验证当前URL的有效性,因此我就直接采用了XMLHttpRequest的方式进行对URL的有效性进行验证。当然对于谷歌地图这个场景,我不建议大家使用这种方法啦,毕竟谷歌地图的api总是抽风,有时候可以访问有时候又不能访问,并且经常不会出现404,基本都是延时很久,所以这个方法不适用与谷歌地图与百度地图的切换判断。
代码及其简单,并且测试也通过了,大部分情况下只要遇到404页面,到能判断到是否有效

let xmlhttp = new XMLHttpRequest();
if (xmlhttp != null) {
    xmlhttp.onreadystatechange = () => {
        if (xmlhttp.readyState == 4) {
            if (xmlhttp.status == 200) {
                console.log('验证成功,URL可用')
            }
            else {
                console.log("验证失败,URL不可用,错误信息:", xmlhttp.statusText);
            }
        }
    };
    xmlhttp.open("GET", url, false);
    xmlhttp.send(null);
} else {
    console.log('你的浏览器OUT了,不支持XMLHTTP,请更换Firefox、Chrome最新版本浏览器')
}

如果你有更好的方法,请在文章后面给我留言,谢谢!

ionic2+使用Slides打造漂亮的导航条

2018/07/04ionic 标签:0

由于之前遇到一个项目使用的ionic中的tabs来做导航条,实际在使用中,总是觉得怪怪的,并且不只是影响到使用效果,更是发生了很多令我费解的问题,由于导航级别太多、分类太复杂,从而导致了tabs的展示令人头痛。不过由于项目已经固化了,没法再进行相应修改和调整,目前也没有重构的打算。也是由于这个一个tabs,当时让我想到了使用Slides组件来打造一个导航条。大家可以先看一下效果:

Slides打造手机导航条

Slides打造手机导航条


根据Slides的滑动特性,其实还是可以做出很漂亮的导航效果来,下面直接上代码,如果对slides不是很了解的,可以查看相关官方文档https://ionicframework.com/docs/api/components/slides/Slides/ 阅读更多

angular2+数据更新但视图不更新的解决方法

最近项目中总是遇到一些莫名其妙的问题,当然这个项目已经存在已久,之前也有过这样的问题,现在感觉问题总是显得很突出,大部分问题都是由于数据更新后,视图无法及时更新而导致的,由于项目的代码原因,我就不多去深入为什么会发生这个问题了,主要的是说一下解决这个问题的方法。
场景
如果你在组件中定义了一个变量,当你使用console能将其值打印出来,可是我们能看到的视图中,这个变量并没有任何值或者改动。又或者你在一个点击事件中去改变相关变量的值,让其显示在视图上,但是当你点击事件触发后,变量的值是改变了,但是视图却为更新。这个时候你就可以使用以下几种方法

1、直接使用ngZong.run()

我们可以将某个要发生改变的变量或者方法直接放到ngZong.run()中。比如:
ngZong.run(()=>{this.closeNum()})

2、ChangeDetectorRef.detectChanges()

此方法本人使用的不多,并没有切确的深入了解这个方法,而且我在进行测试中,这个方法对我来说并未产生任何效果,如果你想要尝试一下,建议看一下官方文档https://angular.io/api/core/ChangeDetectorRef#!#detectChanges-anchor

3、直接使用ngDocheck()生命周期

我们可以将相关代码直接放到ngDocheck中,即可实现视图强制更新。但是一定要注意ngDocheck特别像setInterval,不论你数据是否发生改变他都会执行,并且任意一个事件都有可能触发它。因此得需要慎用,以防影响到性能

关于混合APP横屏、竖屏、翻转的解决方案

我们都知道,cordova或者phonegap都提供了一系列很牛的插件,为我们做开发省了不小力气,在app开发中,有一些app适合竖屏展示,某些app又适合横屏展示,因此我们得去设置它相关的config.xml

一、安卓上的横屏与竖屏

首先我们先来看一下android上的某些原生Activity属性
安卓 Activity 在设备上的显示方向。如果 Activity 是在多窗口模式下运行,系统会忽略该属性。Activity有以下几种属性值 阅读更多

解决ionic3错误:No provider for NavController

有时候感觉ionic会发疯,比如今天我就遇到一个很奇葩的error,我一直在其他页面使用NavController或者Nav都未遇到任何问题,偏偏就在我目前新建的这个页面上出现了这样的一个error,No provider for NavController。
在网上寻找了很久的解决方法,尝试过直接使用app.getActiveNav没有成功,尝试过网上说的@ViewChild('Nav') nav:NavController;也没有成功。后来在ionic论坛上找了相关解决方法,地址是:https://forum.ionicframework.com/t/why-cant-i-import-navcontroller-and-viewcontroller-into-service-or-app/40999/50
可以看到相关代码是这样的:

import { App, NavController } from 'ionic-angular';
constructor(
    public app: App,
    public navCtrl: NavController,
    ) {}
//此处才是最重要的代码
get navController(): NavController {
    return this.app.getRootNav();
}
testNav() {
    //这样使用get的navController
    this.navController.setRoot(Login);
 }

Java Spring-Boot开发环境配置

2018/04/25Java 标签:0

我以前确实玩过一些java web,并且还写过java web,但是那是很久以前的事情了,而且悲催的是我还居然没有用过一个java框架。比如spring、Struts、hibernate之类的框架,我仅仅只是听说过,并未真正研究与使用过。由于工作的需要,我需要搭建一个可以跑起来的 reset api 服务,由此想起之前朋友给我推荐的spring-boot,听说很容易,不过我折腾了一下,环境搭建就花费了我不少时间。下面我就将这过程给大家说一说,当然请先确保你的电脑已经配置好了JDK环境。

一、环境配置

1、java环境配置

JDK配置、maven配置,JDK配置网上已经说得一大片了,再说了不论是搞后端还是搞前端开发基本也离不开JDK环境了,这里主要说一下maven配置。
首先到maven官方下载一个压缩包,https://maven.apache.org/download.cgi
解压后,放到任意位置,我将其放到了/Users/ubeing/Library/maven目录中,这个是MAC开发环境,如果你是windows开发环境,那你可以放到C盘或者其他盘都可以。 阅读更多

JavaScript如何判断对象是否为空

2018/03/07JavaScript 标签:0

我们都知道在JavaScript中,判断一个数组是否为空,我们可以直接使用length进行判断其长度是否为>0,从而来判断数组中是否有内容。而对象却不能使用length这样的方式去判断长度。下面我们就使用两种常用方法去判断下对象。

1、JSON.stringify方法

JSON.stringify()可以将对象转换为字符串,从而我们再去比对字符串即可。如下:

let str = {}
if(JSON.stringify(str)==='{}'){
    console.log('此对象是空对象')
}else{
    console.log('此对象不是空对象')
}

2、ES6语法直接使用Object.keys

Object.keys主要是用于直接获取对象中的所有key的名称,并将其输出为一个数组。因此我们这里需要用到length来判断这个数组的长度,代码如下:

let str = {}
if(Object.keys(str).length>0){
  console.log('对象不是空对象')
}else{
  console.log('对象是空对象')
}

另外我看到有些使用for...in的去循环,但是我尝试了一下,没有成功。不建议大家使用for...in去判断

share

AD