Ionic 4を使用してチャットページを作成していますが、ページの下部まで自動的にスクロールするようにしています。次のようにしたのですが、機能しません。
import { IonContent } from "@ionic/angular";
export class ChatroomPage implements OnInit {
messageForm: FormGroup;
messages: any[];
messenger: any;
@ViewChild(IonContent) content: IonContent;
constructor(
private navExtras: NavExtrasService,
private api: RestApiService,
private httpNative: HTTP
) { }
ngOnInit() {
this.content.scrollToBottom(300);
}
}
Htmlファイル内:
<ion-header>
<ion-toolbar color="primary">
<ion-title>Chatroom</ion-title>
</ion-toolbar>
</ion-header>
<!-- display previous message -->
<ion-content padding id="content">
<ion-list>
<ion-item *ngFor="let message of messages">
{{ message.message }}
</ion-item>
</ion-list>
</ion-content>
<!-- chat message input -->
<ion-footer>
<form [formGroup]="messageForm" (submit)="sendMessage()" (keydown.enter)="sendMessage()">
<ion-input formControlName="message" type="text" placeholder="Enter your message"></ion-input>
<ion-button type="submit">Send</ion-button>
</form>
</ion-footer>
表示されるエラーは次のとおりです。
ng:///ChatroomPageModule/ChatroomPage_Host.ngfactory.js:5 ERROR TypeError:未定義のプロパティ 'scrollToBottom'を読み取れません
私が間違ったことを教えてください。私が見つけたほとんどのチュートリアルはIonic 3を使用しており、ionic-angular
からのContent
の代わりに@ionic/angular
からのIonContent
を使用しています。 Ionic 4のコンテンツを使用するには、scrollToBottomメソッドがないためです。
メソッドscrollToBottom()でコンテンツの下部に到達できます
scrollToBottom(duration?: number) => Promise<void>
ion-content
にIDを追加します
<ion-content #content>
</ion-content>
.tsでコンテンツIDを取得し、選択した期間でscrollToBottomメソッドを呼び出します
@ViewChild('content') private content: any;
ngOnInit() {
this.scrollToBottomOnInit();
}
scrollToBottomOnInit() {
this.content.scrollToBottom(300);
}
https://ionicframework.com/docs/api/content
ViewChildは、提供されたコンテンツIDで正しいデータを取得します
@ViewChild('content') private content: any;
ngOnInitとionViewDidEnter/ionViewWillEnter
ナビゲーションスタックから戻った場合、ngOnInitはトリガーされません。ionViewWillEnter/ ionViewDidEnterがトリガーします。そのため、関数をngOnInitに配置した場合、戻ると、scrollToBottomは機能しません。
Tomas Vancoillieは正しいですが、新しいテキストを追加してリストに追加しても、入力テキストの上にプッシュされません。したがって、テキストを配列にプッシュしてビューを最下部に更新するには、ngZoneを使用します。
1。
import { Component, ViewChild,NgZone } from '@angular/core';
public _zone: NgZone
this._zone.run(() => {
setTimeout(() => {
this.contentchat.scrollToBottom(300);
});
});
ほとんどのコードは問題ありません。 Ionic 4.では、2つの変更を行うだけで機能します。ここに変更があります。
変更1(HTMLファイル):
置換:
_<ion-content padding id="content">
_
with:
_<ion-content padding #content>
_
変更2(TSファイル):
置換:
_scrollToBottomOnInit() {
this.content.scrollToBottom(300);
}
_
with:
_scrollToBottomOnInit() {
setTimeout(() => {
if (this.content.scrollToBottom) {
this.content.scrollToBottom(400);
}
}, 500);
}
_
注:
IonContent
をインポートしない場合(すでに行った方法と同様)、コードはコンパイルに失敗し、次のようなコンソールエラーが表示されます。
ERROR Error: Uncaught (in promise): ReferenceError: Cannot access 'MessagesPageModule' before initialization
ここで、MessagesPageModule
は、機能を実装しようとしているページに関連付けられているモジュールです。
ionic 4の最近の変更により、提案された回答のコードが機能しないことがわかりました。これがすべての新規参入者に役立つことを願っています。
import { IonContent } from '@ionic/angular';
export class IonicPage implements OnInit {
@ViewChild(IonContent, {read: IonContent, static: false}) myContent: IonContent;
constructor() {}
ScrollToBottom(){
setTimeout(() => {
this.myContent.scrollToBottom(300);
}, 1000);
}
}
<ion-content>の.htmlファイルにIDが指定されていません
公式ドキュメントは ion-content を参照しています。 Ionicこの投稿の時点で以下にリストされているバージョンが使用されています。
Ionic CLI : 5.4.13 Ionic Framework : @ionic/angular 4.11.3 @angular/cli : 8.1.3
これは2019年12月で機能します。
。html
<ion-content #content>
</ion-content>
。ts
@ViewChild('content', { static: false }) content: IonContent;
constructor(){}
ngOnInit(): void {
this.scrollToBottom();
}
scrollToBottom(): void {
this.content.scrollToBottom(300);
}