import { Injectable } from '@angular/core'; import { App,ViewController, NavOptions } from 'ionic-angular' import { KeyboardComponent, KeyboardNumberComponent,KeyboardSocialComponent, KeyboardOption } from '../keyboard'; import { Message } from "../service" import { Keyboard } from '@ionic-native/keyboard' // == 模拟键盘 @Injectable() export class Keyboards { keyboardModal isOpen:boolean = false constructor( public _app: App, public message: Message, public keyboard: Keyboard ) { } /** * 激活模态框 * @param component * @param option * @param autoClose * @returns {ModalController} */ action = (component, option) => { const defaultModalOptions = { enterAnimation: 'modal-slide-in', leaveAnimation: 'modal-slide-out' }; option = Object.assign({}, defaultModalOptions, option); this.keyboardModal = this.create(component, option); // 创建模态组件 // 打开后添加页面跳转、关闭等监控 this.keyboardModal.present().then(() => { if(this.keyboardModal.instance.onPresent) this.keyboardModal.instance.onPresent(); this.keyboardModal.didLeave.subscribe(() => { this.isOpen = false; }); }); return this.keyboardModal; } /** * 构建模态框 * @param component 模态框组件 * @param option 模态框配置 */ create = (component: any, option: any = {}) => { return new KeyboardController(this._app, component, option); } // 数字键盘 number = (option: any, callback?: Function) => { if(this.isOpen) return; // 已开启则不在触发 this.isOpen = true; option = this._mergeOption(option, callback); //option.enableBackdropDismiss = true; // 点击背景可关闭 if(this.keyboard) this.keyboard.close(); // 关闭原生键盘 return this.action(KeyboardNumberComponent, option); } // promise版本 number2 = (option: any) => { return new Promise((resolve)=>{ this.number(option, (res) => { resolve(res) }) }) } // 社交(微信分享等) social = (option: any, callback?: Function) => { if(this.isOpen) return; // 已开启则不在触发 this.isOpen = true; option = this._mergeOption(option, callback); // option.enableBackdropDismiss = true; // 点击背景可关闭 option.enableBackdrop = true; if(this.keyboard) this.keyboard.close(); // 关闭原生键盘 return this.action(KeyboardSocialComponent, option); } // 合并配置 _mergeOption = (option: KeyboardOption, callback?:Function):KeyboardOption => { let mergeOption:any = {}; if(typeof option == 'object' && !!option.input){ mergeOption = option; }else{ mergeOption.input = option || ''; } if(callback) mergeOption.confirm = mergeOption.confirm || callback; return mergeOption; } } /** * 模态框控制层,往app内自动添加modal组件 */ export class KeyboardController extends ViewController { public _app: App; public _enterAnimation: string; public _leaveAnimation: string; constructor(app: App, component: any, option: any) { option = option || {}; option.component = component; // modal内的子组件 const opts:any = {}; // 默认Modal模块配置 opts.enableBackdrop = !!option.enableBackdrop; opts.enableBackdropDismiss = option.enableBackdropDismiss ? !!option.enableBackdropDismiss : false; opts.enterAnimation = option.enterAnimation; opts.leaveAnimation = option.leaveAnimation; option.opts = opts; // 将Modal组件传入app控件,data可在NavParams访问 super(KeyboardComponent, option, null); this._app = app; this._enterAnimation = option.enterAnimation; this._leaveAnimation = option.leaveAnimation; this.isOverlay = true; } // 过渡动画名称 getTransitionName(direction: string): string { let key: string; if (direction === 'back') { if (this._leaveAnimation) { return this._leaveAnimation; } key = 'modalLeave'; } else { if (this._enterAnimation) { return this._enterAnimation; } key = 'modalEnter'; } return this._nav && this._nav.config.get(key); } // 往app添加modal组件 present(navOptions: NavOptions = {}) { const self = this; navOptions.minClickBlockDuration = navOptions.minClickBlockDuration || 400; return this._app.present(self, navOptions); } }