text.component
(セレクタapp-text
)で問題が発生しました(作成時だけでなく)アプリの使用期間の途中で初期化されました。ngOnInitがコンポーネントライフタイムの途中で呼び出されました
これはapp.component.htmlです:
<div class="container-fluid" *ngFor="let text of texts;let i=index">
<app-text (textInfoEmitter)="dataFromChild($event)" [elementId]=i [ngStyle]="{'transform': getRotation(i), 'font-size.px':getFontSize(i)}" ></app-text>
</div>
私はtextInfoEmitter
機能をapp-text
からデータを放出し、dataFromChild(e)
とapp.component.ts
でモデルを更新しています。
私が気づいたのは、textInfoEmitter
が、app-text
が再初期化されることに気づきました。私は、ngOnInit
とconstructor
関数が呼び出されていることを確認できます。
export class AppComponent implements OnInit {
texts: [TextModel];
ngOnInit() {
this.texts = [
{
rotation: 30,
fontSize: 16,
offset: { left: 120, top: 200 },
scale: 1.4
}
]
}
dataFromChild(e) {
this.texts[e.elementID] = {
rotation: e.rotation,
fontSize: e.fontSize,
offset:e.offset,
scale: 1
}
}
getRotation(i: number) {
return "rotate(" + this.texts[i].rotation + "deg)";
}
getFontSize(i: number) {
return this.texts[i].fontSize;
}
}
text.component.ts
が複雑であると私はオンライン複雑な角度プロジェクトを複製する方法を発見していない:
これはapp.component.tsファイルです。これは私が発するヘルパー関数を呼び出している:
emitData(e){
if ($(e).hasClass("h")){
this.parentId = $(e).attr("id");
}else{
this.parentId = $(e).parent().attr("id");
}
this.textInfoEmitter.emit(
{
elementID: this.parentId,
rotation: this.delta.circleX,
fontSize: this.delta.fontSize,
offset: {
left: this.drag.x,
top: this.drag.y
}
}
);
}
delta
とdrag
がtext.component.ts
でモデルです。
私の質問は、コンポーネントが生涯にどのような状況で再初期化されるのですか?どのようにこれを防ぐことができますか?
問題のレプリカです。 ngFor指示句を使用してEventEmitterでモデルを更新することで、同じことをする必要があります。今回は、モデルの更新時にngOnInitが起動されません。
app.component.ts
import { Component } from '@angular/core';
declare var $;
@Component({
selector: 'app-root',
template: `
<div class="container-fluid" *ngFor="let text of texts; let i = index">
<app-text id="i" (dataEmitter)="setData($event)" [ngStyle]="{'transform': getRotation()}"></app-text>
</div>
`,
styleUrls: ['./app.component.css']
})
export class AppComponent {
texts = [
{rotate:10}
];
ngOnInit(){
}
getRotation(){
return "rotate("+this.texts[0].rotate+"deg)";
}
setData(e){
this.texts[0].rotate = e;
}
}
text.component.ts
import { Component, OnInit, Output, EventEmitter } from '@angular/core';
declare var $;
@Component({
selector: 'app-text',
template:`<div tabindex="-1" (mousedown)="mousedown($event)" (focusout)="focusout($event)">Text</div>` ,
styleUrls: ['./text.component.css']
})
export class TextComponent implements OnInit {
@Output() dataEmitter = new EventEmitter();
constructor() { }
ngOnInit() {
console.log("ng on Init");
}
mousedown(e){
$(e.target).focus();
$(e.target).addClass("selected");
this.dataEmitter.emit(50);
}
focusout(e){
console.log("f out");
$(e.target).removeClass("selected");
}
}
問題のレプリカである別のコードを追加しました。私はngForを使用してデータを発信しています。しかし、この場合、モデルの更新時にngOnInitは起動しません。もちろんそれはオブジェクトへの参照を変更しないので、 – sanjihan