Не удалось установить фокус на мой <ионный вход>, когда я вхожу на страницу
Я хочу, чтобы фокус был установлен на моем <ion-input>
при входе на страницу
Это мой код typescript:
import { Component, Input, ViewChild,ElementRef,Renderer } from '@angular/core';
import { NavController, PopoverController, NavParams, ViewController, ModalController } from 'ionic-angular';
@Component({
selector: 'page-comments',
templateUrl: 'comments.html'
})
export class CommentsParentPage {
@ViewChild('input') myInput;
constructor(public navCtrl: NavController,private renderer: Renderer,
private elementRef: ElementRef, public modalCtrl: ModalController) {
}
ionViewLoaded() {
setTimeout(() => {
let element = this.elementRef.nativeElement.querySelector('input');
this.renderer.invokeElementMethod(element, 'focus', []);
},150);
}
}
И это то, что я сделал с моим файлом html
:
<ion-item>
<ion-input set-focuser type="text" placeholder="Write Your Comments" [(ngModel)]="addComment"></ion-input>
</ion-item>
Всякий раз, когда я вхожу на эту страницу своего приложения, я бы хотел, чтобы клавиатура была открыта и фокус был установлен на ion-input
Мой config.xml
включает в себя:
<preference name="KeyboardDisplayRequiresUserAction" value="false" />
package.json
{
"name": "sample app",
"author": "",
"homepage": "http://ionicframework.com/",
"private": true,
"scripts": {
"clean": "ionic-app-scripts clean",
"build": "ionic-app-scripts build",
"ionic:build": "ionic-app-scripts build",
"ionic:serve": "ionic-app-scripts serve"
},
"dependencies": {
"@angular/common": "2.2.1",
"@angular/compiler": "2.2.1",
"@angular/compiler-cli": "2.2.1",
"@angular/core": "2.2.1",
"@angular/forms": "2.2.1",
"@angular/http": "2.2.1",
"@angular/platform-browser": "2.2.1",
"@angular/platform-browser-dynamic": "2.2.1",
"@angular/platform-server": "2.2.1",
"@ionic-native/core": "^3.4.4",
"@ionic-native/keyboard": "^3.4.4",
"@ionic/cloud-angular": "^0.10.0",
"@ionic/storage": "1.1.7",
"angular2-moment": "^1.1.0",
"google-libphonenumber": "^2.0.14",
"ionic-angular": "2.0.0-rc.4",
"ionic-gallery-modal": "0.0.7",
"ionic-native": "2.2.11",
"ionicons": "3.0.0",
"rxjs": "5.0.0-beta.12",
"zone.js": "0.6.26"
},
"devDependencies": {
"@ionic/app-scripts": "1.0.0",
"typescript": "2.0.9"
},
"cordovaPlugins": [
"ionic-plugin-keyboard",
"cordova-plugin-whitelist",
"cordova-plugin-console",
"cordova-plugin-statusbar",
"cordova-plugin-device",
"cordova-plugin-splashscreen",
"cordova-sqlite-storage",
"cordova-plugin-x-toast",
"cordova-plugin-camera",
"cordova-plugin-compat",
"cordova-plugin-image-picker",
"cordova.plugins.diagnostic",
{
"id": "phonegap-plugin-push",
"locator": "phonegap-plugin-push",
"variables": {
"SENDER_ID": "461076790064"
}
},
"cordova-plugin-contacts",
"ionic-plugin-deploy",
"cordova-plugin-x-socialsharing",
{
"locator": "https://github.com/napolitano/cordova-plugin-intent",
"id": "com.napolitano.cordova.plugin.intent"
},
"cordova-plugin-screen-orientation",
"cordova-plugin-file",
"cordova-plugin-file-transfer"
],
"cordovaPlatforms": [
{
"platform": "android",
"version": "",
"locator": "android"
}
],
"description": "ionic2: An Ionic project"
}
Ответы
Ответ 1
использовать ngAfterViewChecked:
Смотрите plnkr здесь
import { Component, Input, ViewChild,ElementRef,Renderer, AfterViewChecked,ChangeDetectorRef } from '@angular/core';
import { NavController, PopoverController, NavParams, ViewController, ModalController } from 'ionic-angular';
@Component({
selector: 'page-comments',
templateUrl: 'comments.html'
})
export class CommentsParentPage implements AfterViewChecked {
@ViewChild('input') myInput;
needsFocus: boolean;
constructor(public navCtrl: NavController,private renderer: Renderer,
private elementRef: ElementRef, public modalCtrl: ModalController,
private _changeDetectionRef: ChangeDetectorRef) {
}
ionViewDidEnter() {
this.needsFocus = true;
}
public ngAfterViewChecked(): void {
if (this.needsFocus) {
this.needsFocus = false;
this.myInput.setFocus();
this._changeDetectionRef.detectChanges();
}
}
Ответ 2
Вы можете сделать это, используя Directive
, как показано ниже. Код надежды не требует пояснений. Если у вас есть какие-либо проблемы, прокомментируйте ниже.
Играйте с Git Код репорта.
Вы можете просмотреть это на Ionic View: Id = F5F367AE
Примечание. Просто коснитесь My Page
.
![введите описание изображения здесь]()
Set-focuser.ts
import { Directive, Renderer, ElementRef } from '@angular/core';
import { Keyboard } from '@ionic-native/keyboard';
@Directive({
selector: '[set-focuser]' // Attribute selector
})
export class SetFocuser {
constructor(private renderer: Renderer, private elementRef: ElementRef, public keyboard: Keyboard) {
}
ngAfterViewInit() {
const element = this.elementRef.nativeElement.querySelector('input');
// to delay
setTimeout(() => {
this.renderer.invokeElementMethod(element, 'focus', []);
this.keyboard.show();
}, 500);
}
}
.html
<ion-input set-focuser type="text"></ion-input>
app.module.ts
import { SetFocuser } from "../components/set-focuser/set-focuser";
@NgModule({
declarations: [
SetFocuser,
],
Проблемы с вашим пакетом. json
-
Вам нужно удалить модуль "ionic-native": "2.2.11",
.
-
Используйте "@ionic/app-scripts": "1.1.4",
вместо "@ionic/app-scripts": "1.0.0",
-
После выполнения указанных выше изменений выполните npm i
Это официальный файл package.json.
Ответ 3
Вы можете попробовать простой метод.
<div ng-init="getfocus()">
<ion-input id="myAnchor" type="text" placeholder="Write Your Comments"/>
</div>
В js файле вызывается функция с ng-init
function getfocus() {
document.getElementById("myAnchor").focus();
}
Надеюсь, что этот код поможет вам. Если вы получите какую-либо ошибку, прокомментируйте.