关于ionic:ionic解决picker选择器组件动态刷新选项重叠消失的问题

本地环境 Ionic: Ionic CLI : 6.17.1 Ionic Framework : @ionic/angular 5.9.2 @angular-devkit/build-angular : 12.0.0 @angular-devkit/schematics : 12.0.5 @angular/cli : 12.0.5 @ionic/angular-toolkit : 4.0.0问题阐明多列抉择的时候,动静刷新其余列,呈现选项全挤在一行的状况,滑动后恢复正常。属于官网未解决的bug:https://github.com/ionic-team... 解决方案每列的选项数量固定为可能性的最大值,理论选项有余的时候填补空白选项,并设置disabled属性。这样空选项不会显示进去。 if (newOptions.length < max) { for (let j = newOptions.length - 1; j < max; j++) { const disabledOption: PickerColumnOption = { text: '', value: -1, disabled: true, // 空白选项不显示 transform: '', // 解决切换选项后,有时选项不会显示的问题 } newOptions.push(disabledOption) } }触发刷新还须要保障列PickerColumn的prevSelected != selectedIndex,比方新建列前者不设置,后者设为0.

December 16, 2021 · 1 min · jiezi

关于ionic:我用ionic撸了一个USB转串口的调试工具

因为最近应产品经理的需要,须要做一个Android版的上位机APP,为此专门到某宝上购买了一个Type-C转串口的小设施,而后就开始折腾了。花了几天的工夫就把上位机APP做进去了,起初在闲暇工夫又做了一个串口调试的小工具,成果如下图 创立我的项目ionic start blank创立一个空白我的项目 装置串口插件要做一个串口通信的工具,那就得和硬件打交道,正好依据ionic官网文档,我找到了一个串口通信的插件,名为cordovarduino,通过尝试之后,发现此插件因为久年失修,尽管能够应用,然而在收发数据的时候总是无奈残缺接管到数据。依据对其代码查看,发现其中lib目录下有一个usbseriallibrary.jar文件,这个应该就是USB串口的驱动文件了吧。 久年失修的插件,预计就是这个jar包有问题,应该更新一下这个jar包就能够了,因而,通过usb-serial-for-android这个我的项目的介绍我从新打包了一个jar包,实现后尝试了一下,的确很完满,并且收发数据也没有任何问题了。因而,本人依据cordovarduino我的项目从新copy了一个我的项目cordova-plugin-usbserialport,因而你只须要装置我提供的插件即可 装置串口插件ionic cordova plugin add cordova-plugin-usbserialport装置本地数据存储插件ionic cordova plugin add cordova-plugin-nativestoragenpm install @ionic-native/native-storage装置状态栏插件ionic cordova plugin add cordova-plugin-statusbarnpm install @ionic-native/status-bar装置设施信息插件ionic cordova plugin add cordova-plugin-devicenpm install @ionic-native/device装置获取版本号插件ionic cordova plugin add cordova-plugin-app-versionnpm install @ionic-native/app-version装置APP最小化插件ionic cordova plugin add cordova-plugin-appminimizenpm install @ionic-native/app-minimize装置后盾运行插件ionic cordova plugin add cordova-plugin-background-modenpm install @ionic-native/background-mode串口操作次要代码declare let usbSerialPort: any; // 引入串口插件// 关上串口async openSerialPort() { const config = await this.nativeStorage.getItem('config'); // First request permission usbSerialPort.requestPermission(() => { console.log('get permission success.'); usbSerialPort.getDevice(data => { this.title = data.name; }); // open serial usbSerialPort.open(config, () => { console.log('Serial connection opened'); // get open status this.isOpen(); // read listener usbSerialPort.readListener(data => { clearTimeout(this.timer); const view = new Uint8Array(data); console.log(this.utils.bytes2HexString(view)); this.receiveDataArray.push(view); this.timer = setTimeout(() => { const now = new Date(); const dateMs = now.getMilliseconds(); this.zone.run(() => { const date = `<span style="color: #2fdf75">${this.utils.formatDate(now, 'hh:mm:ss')}.${dateMs} > </span>`; const resultUint8Array = this.utils.concatUint(Uint8Array, ...this.receiveDataArray); if (!this.utils.bytes2HexString(resultUint8Array)) { return; } this.receiveData += `<div style="-webkit-user-select: auto;-moz-user-select: auto;-ms-user-select: auto;user-select: auto;">${date}${this.utils.strDivision(this.utils.bytes2HexString(resultUint8Array), 2)}</div>`; this.receiveData += `<div style="margin-top:8px"></div>`; this.receiveLength = this.utils.bytes2HexString(resultUint8Array).length / 2; this.scrollToBottom(); }); }, 500); }, err => { console.log(`Read listener error: ${err}`); }); }); }, err => { console.log(`Get permission error: ${err}`); if (this.openStatus) { this.zone.run(() => { this.openStatus = false; this.title = this.translate.instant('SERIAL_DEVICE_TITLE'); }); } this.presentToast(this.translate.instant('NO_DEVICE_CONNECTED')); });}// 串口写入writerSerial() { if (!this.openStatus) { if (this.pack) { this.presentAlert(); } return; } this.receiveDataArray = []; const now = new Date(); const dateMs = now.getMilliseconds(); if (this.isWriterHex) { usbSerialPort.writeHex(this.pack, (res: any) => { console.log('writer res: ', res); const date = `<span style="color:#3880ff">${this.utils.formatDate(now, 'hh:mm:ss')}.${dateMs} < </span>`; this.receiveData += `<div>${date}${this.utils.strDivision(this.pack, 2)}</div>`; this.sendLength = this.pack.length / 2; }, err => { console.log('writer hex err: ', err); this.presentToast(); this.closeSerial(); }); } else { usbSerialPort.write(this.pack, (res: any) => { console.log('writer res: ', res); const date = `<span style="color:#3880ff">${this.utils.formatDate(now, 'hh:mm:ss')}.${dateMs} < </span>`; this.receiveData += `<div>${date}${this.utils.strDivision(this.utils.bufToHex(this.utils.stringToBytes(this.pack)), 2)}</div>`; this.sendLength = this.utils.getStringByteLength(this.pack); }, err => { console.log('writer string err: ', err); this.presentToast(); this.closeSerial(); }); }}// 串口开启状态isOpen() { usbSerialPort.isOpen(status => { console.log(`Serial open status: ${status}`); this.zone.run(() => { this.openStatus = status; }); });}// 敞开串口closeSerial(isOpenSerial?: boolean) { usbSerialPort.close(() => { this.isOpen(); this.receiveDataArray = []; if (isOpenSerial) { this.openSerialPort(); } });}其余为了可能对串口波特率进行设置,我还做了一个设置页面,次要用于设置波特率、数据位、进行位、以及收发数据记录的背景色彩切换、语言切换等性能。 ...

September 1, 2021 · 3 min · jiezi

关于ionic:Angluar5ionic3实践五

背景:复宏汉霖我的项目CR做完后.来整顿下须要优化的中央和给其余页面发送音讯知识点. 优化我的项目启动工夫先记一下:最开始运行的时候所需工夫:删完99%的console.log和解决掉所有tslint的报错后我的项目跑起来的工夫: 整整少了14.78s.真得不要小看console.log... 发送音讯理论开发场景 : 以后登录人的信息是保留在主页面的.最开始登陆进去的时候存入主页面的,而后其余页面用到的人员信息是主页面传进去的.在其中一个模块批改了人员岗位后.主页面没有从新获取人员信息.则会导致其余模块的信息有误.解决思路: 在其中一个模块批改了人员岗位后,给主页面传一个音讯.通知它须要从新获取登录人的信息.(其余任意页面都能通过Events获取到这个音讯) // 批改人员岗位的模块代码内容:import {Events} from 'ionic-angular';export class SetupPage { constructor(public ev: Events){} // 岗位切换 chooseJob = ()=>{ if (this.territoryList.length <= 1) { return; } let modal = this.modalCtrl.create("ChooseJobPage", { jobList:this.territoryList ,territoryID},{ cssClass: 'inset-modal'}); modal.onDidDismiss(data => { if (data.action == 'save') { // 在岗位切换胜利后通知主页面要从新获取人员信息 // 利用this.ev.publish('selectedStff')发消息. this.staffService.SelectedTerritoryToken(json).then((info) => {this.ev.publish('selectedStff')})} }); modal.present(); }}// 主页面代码内容:import {Events} from 'ionic-angular';export class MyApp { constructor(public ev: Events){ // 接管到音讯后,去调取获取人员信息接口 ev.subscribe("selectedStff", () =>{ this.getStaffInfo(); }) } // 获取以后用户信息 getStaffInfo = () => this.staffService.GetStaffInfo().then((info) => { // 从新赋值人员信息 this.currentStaff = info; });}

September 25, 2020 · 1 min · jiezi

关于ionic:只需三步即可创建出你的ionic项目简单使用

背景:之前我的项目是用React+AntDesignPro写的.再过两个礼拜就有一个新我的项目要写了.这个我的项目主管要求用Angular+ionic写,于是与开始了我的学习之旅.从创立一个ionic我的项目开始!加油!! 第一步:装置ionic用管理员的身份关上命令窗口肯定要先装置node环境运行命令: npm install -g ionic如下图 : 第二步:新建ionic我的项目2.1:切到你须要装置的我的项目文件夹下2.2:运行新建ionic我的项目的命令 ionic start命令介绍: // 给你的新我的项目取个名字 例:testIonicProject name: testIonic// 抉择新我的项目应用的框架:React/Angular 例:AngularFramework: Angular// 抉择下载我的项目模板 例:blank(空白)Starter template: blank如下图: 我的项目创立胜利后会呈现[Info]提醒: 第三步:运行ionic我的项目3.1:切到你刚刚创立的我的项目文件夹目录下3.2:运行我的项目运行命令: ionic serve运行胜利后会呈现一个地址http://localhost:8100页面上关上这个地址就会呈现以下页面代表整个步骤运行胜利! 应用vscode运行ionic的我的项目第一步:用vscode关上你的我的项目文件夹第二步:运行我的项目关上NPM文件夹鼠标移至start下面右侧会呈现一个小箭头,点击运行(因为懒的敲命令,点击start就能够运行了.也能够在vscode上方的终端,新建终端,输出ionic serve,是一样的成果~ 都是运行我的项目) 因为没有写过Angular的我的项目,所以首次运行的时候会有个确认装置Angular的提醒,抉择Y就好.运行胜利后会呈现一个窗口地址.http://localhost:4200这样就代表你用vscode运行我的项目胜利了~~浏览器关上窗口地址呈现了上面的页面.真香~~ 我的项目目录介绍我的项目目录如下: src // 开发工作目录,页面、款式、脚本和图片都放在这个目录下src/app // 利用根目录(组件、页面、服务、模块)src/assets // 资源目录(动态文件,图片,js框架...)src/environments // 环境配置src/theme // 主题文件,外面有一个scss文件,设置主题信息src/global.scss // 全局 css 文件src/index.html // index 入口文件src/global.scss // 全局款式src/main.ts // 主入口文件src/polyfills.ts // 这个文化蕴含 Angular 须要的填充,并在应用程序之前加载angular.json // angular配置文件ionic.config.json // ionic配置文件package.json // 配置我的项目的元数据和治理我的项目所须要的依赖package-lock.json // 本次配置我的项目的元数据和治理我的项目所须要的依赖tsconfig.json // TypeScript 我的项目的根目录,指定用来编译这个我的项目的问根文件和编译选项tslint.json // 格式化和校验 typescript ...

July 29, 2020 · 1 min · jiezi

关于ionic:只需三步即可创建出你的ionic项目简单使用

背景:之前我的项目是用React+AntDesignPro写的.再过两个礼拜就有一个新我的项目要写了.这个我的项目主管要求用Angular+ionic写,于是与开始了我的学习之旅.从创立一个ionic我的项目开始!加油!! 第一步:装置ionic用管理员的身份关上命令窗口肯定要先装置node环境运行命令: npm install -g ionic如下图 : 第二步:新建ionic我的项目2.1:切到你须要装置的我的项目文件夹下2.2:运行新建ionic我的项目的命令 ionic start命令介绍: // 给你的新我的项目取个名字 例:testIonicProject name: testIonic// 抉择新我的项目应用的框架:React/Angular 例:AngularFramework: Angular// 抉择下载我的项目模板 例:blank(空白)Starter template: blank如下图: 我的项目创立胜利后会呈现[Info]提醒: 第三步:运行ionic我的项目3.1:切到你刚刚创立的我的项目文件夹目录下3.2:运行我的项目运行命令: ionic serve运行胜利后会呈现一个地址http://localhost:8100页面上关上这个地址就会呈现以下页面代表整个步骤运行胜利! 应用vscode运行ionic的我的项目第一步:用vscode关上你的我的项目文件夹第二步:运行我的项目关上NPM文件夹鼠标移至start下面右侧会呈现一个小箭头,点击运行(因为懒的敲命令,点击start就能够运行了.也能够在vscode上方的终端,新建终端,输出ionic serve,是一样的成果~ 都是运行我的项目) 因为没有写过Angular的我的项目,所以首次运行的时候会有个确认装置Angular的提醒,抉择Y就好.运行胜利后会呈现一个窗口地址.http://localhost:4200这样就代表你用vscode运行我的项目胜利了~~浏览器关上窗口地址呈现了上面的页面.真香~~ 我的项目目录介绍我的项目目录如下: src // 开发工作目录,页面、款式、脚本和图片都放在这个目录下src/app // 利用根目录(组件、页面、服务、模块)src/assets // 资源目录(动态文件,图片,js框架...)src/environments // 环境配置src/theme // 主题文件,外面有一个scss文件,设置主题信息src/global.scss // 全局 css 文件src/index.html // index 入口文件src/global.scss // 全局款式src/main.ts // 主入口文件src/polyfills.ts // 这个文化蕴含 Angular 须要的填充,并在应用程序之前加载angular.json // angular配置文件ionic.config.json // ionic配置文件package.json // 配置我的项目的元数据和治理我的项目所须要的依赖package-lock.json // 本次配置我的项目的元数据和治理我的项目所须要的依赖tsconfig.json // TypeScript 我的项目的根目录,指定用来编译这个我的项目的问根文件和编译选项tslint.json // 格式化和校验 typescript ...

July 29, 2020 · 1 min · jiezi

Ionic34文件选择插件filechooser选择图片上传的问题

抉择图库中的文件上传请看另一文章在挪动我的项目开发中,应用的是Ionic框架,当中波及到文件上传。 开发思路: 应用文件抉择插件获取门路应用门路上传文件开发流程波及到的组件有(Ionic官网文档) 文件抉择 https://ionicframework.com/do...文件关上 https://ionicframework.com/do... (在已上传的文件列表中可能你会应用上)文件门路 https://ionicframework.com/do...插件装置上面只列举文件抉择的插件装置办法。文件关上和文件门路装置形式同理,文档有具体形容,文件抉择插件有版本的注意事项 Ionic3.x $ ionic cordova plugin add cordova-plugin-filechooser$ npm install --save @ionic-native/file-chooser@4Ionic4.x $ ionic cordova plugin add cordova-plugin-filechooser$ npm install @ionic-native/file-chooser文件抉择 filechooser文件抉择filechooser插件能调用手机中的文件治理,抉择文件夹外面的文件,胜利则返回文件的门路。应用办法如下 Ionic3.x import { FileChooser } from '@ionic-native/file-chooser';constructor(private fileChooser: FileChooser) { }...this.fileChooser.open() .then(uri => { // uri 文件的门路 console.log(uri) }) .catch(e => console.log(e));Ionic4.x import { FileChooser } from '@ionic-native/file-chooser/ngx';constructor(private fileChooser: FileChooser) { }...this.fileChooser.open() .then(uri => { // uri 文件的门路 console.log(uri) }) .catch(e => console.log(e));这时候,你能够应用取得的uri,联合http申请 或者 file-transfer插件进行文件上传。然而,你在抉择图片文件进行上传时,发现会上传失败,具体调试时发现并没上进行文件上传,其实起因是没有找到文件。请持续往下看。 ...

July 10, 2020 · 1 min · jiezi