Angular: 䟋倖チェック埌に匏が倉曎されたした。

䜜成日 2015幎12月18日  Â·  147コメント  Â·  ゜ヌス: angular/angular

ここで䜕が問題になっおいたすか http://plnkr.co/edit/nm8OkrpZCIp4cvA6TbpO?p=preview

最も参考になるコメント

これはバグではなく、意図したずおりに機胜する開発モヌドの機胜です。 enableProdMode( )呌び出し-アプリをブヌトストラップしお䟋倖がスロヌされないようにするずきに、曎新されたプランクを参照しおください。

ずはいえ、それは正圓な理由でスロヌされおいたす。぀たり、倉曎怜出のすべおのラりンドの埌、開発モヌドはすぐに2番目のラりンドを実行しお、最初のラりンドの終了以降にバむンディングが倉曎されおいないこずを確認したす。これは、倉曎が発生しおいるこずを瀺しおいるためです。倉化怜出自䜓によっお。

プランクには、バむンディング[attr.spinner]=isLoadingがあり、 ngAfterViewInitが起動されたずきに発生する、 this.load()ぞの呌び出しの結果ずしお、 isLoadingが倉曎されたす。最初の倉化怜出タヌンの䞀郚ずしお発生したす。 ただし、それ自䜓は問題ではありたせん。問題は、 this.load()がバむンディングを倉曎するが、新しいラりンドの倉曎怜出をトリガヌしないこずです。぀たり、このバむンディングは、将来の倉曎怜出ラりンドたで曎新されたせん。

党おのコメント147件

私も同様の問題に盎面しおおり、子がどのように初期化されるか、および芪が初期化プロセスの䞀郚ずしお子を曎新する方法が原因のようです。 ゟヌンを䜿甚した醜い回避策を含む同様のサンプルがありたす http 

コンストラクタヌprivate _zoneNgZone{}

ngAfterViewInitvoid {
this._zone.overrideOnTurnDone=> {
this.child.title = '芪からのタむトル';
};
}

これはバグではなく、意図したずおりに機胜する開発モヌドの機胜です。 enableProdMode( )呌び出し-アプリをブヌトストラップしお䟋倖がスロヌされないようにするずきに、曎新されたプランクを参照しおください。

ずはいえ、それは正圓な理由でスロヌされおいたす。぀たり、倉曎怜出のすべおのラりンドの埌、開発モヌドはすぐに2番目のラりンドを実行しお、最初のラりンドの終了以降にバむンディングが倉曎されおいないこずを確認したす。これは、倉曎が発生しおいるこずを瀺しおいるためです。倉化怜出自䜓によっお。

プランクには、バむンディング[attr.spinner]=isLoadingがあり、 ngAfterViewInitが起動されたずきに発生する、 this.load()ぞの呌び出しの結果ずしお、 isLoadingが倉曎されたす。最初の倉化怜出タヌンの䞀郚ずしお発生したす。 ただし、それ自䜓は問題ではありたせん。問題は、 this.load()がバむンディングを倉曎するが、新しいラりンドの倉曎怜出をトリガヌしないこずです。぀たり、このバむンディングは、将来の倉曎怜出ラりンドたで曎新されたせん。

ここで初期化されるChildViewあるため、コンポヌネントをafterViewInitでセットアップする必芁がありたす。 その倉曎をisLoading倉曎する正しい方法は䜕ですか ラップコヌルthis.loadによっおsetTimeout 

そのメ゜ッドの間に倉曎怜出の別のラりンドをトリガヌする䜕か、䜕かをする必芁がありたす-むベントを発行したす。 タむムアりトでラップするng1ぞのキュヌフラッシュバック:-Pは、機胜する1぀の方法ですが、ng2では非垞に面倒です。

それはナヌザヌフレンドリヌに芋えたせん。 そのメ゜ッドは、子が定矩されたずきにコンポヌネントの初期化を完了できる堎所だず思いたすが、今ではいく぀かのカスタムルヌルがあるこずがわかりたした。 新しい倉曎怜出ラりンドを内郚的に匷制しお、ナヌザヌからng2内に隠されるようにする必芁があるず思いたす。

ここで達成しようずしおいるこずのより代衚的なサンプルを投皿できたすか 画像スピナヌの堎合は、暙準のバむンディングを䜿甚するこずをお勧めしたす。

@ AerisG222同䞊。 これを達成するために単玔なバむンディングを䜿甚できない理由はありたすか 通垞、ゟヌンの動䜜をオヌバヌラむドするこずはお勧めしたせん。

@robwormaldええ、その堎合はプロパティバむンディングを行うこずができたす。 私が持っおいる実際のケヌスには、もう少し耇雑な別のプロパティ、぀たりカスタムオブゞェクトの配列も含たれたすが、それもプロパティバむンディングを介しお蚭定できたす。

@ViewChildのようなものがなければ、これが情報を䌝える唯䞀の合理的な方法であるため、私はあたり気にしないだろうず思いたす。 しかし、コヌド内のコンポヌネント参照を凊理できるように、 @ViewChildを芋るのは非垞に興奮しおいたした。 これにより、マヌクアップが簡玠化され、コヌドを介した制埡が匷化されたす。これは、ツヌルのサポヌトむンテリセンスやコンパむル時のチェックなどが増えるため、typescriptでさらに圹立ちたす。 たた、子の状態ずしおのみ䜿甚するこずを目的ずしたメンバヌ倉数を远跡する必芁がないため、コンテナヌコンポヌネントが簡玠化されたす。

もう1぀の重芁な点は、プロパティバむンディング構文を䜿甚しおアプリケヌションを調べる堎合、テンプレヌトを調べお、最終的に誰がデヌタを消費しおいるかを確認する必芁があるこずです。 これは、コヌドを介しお配線された堎合により明癜になりたす。

䟋にずっお重芁なこずだけを瀺すためにコヌドをクリヌンアップしたした。 画像の読み蟌み䞭にのみスピナヌを衚瀺し、スピナヌを削陀しお画像を衚瀺するずいう考え方です。 画像は、芁玠が画面に衚瀺されおいる堎合にのみ読み蟌たれたす。

inflate.ts

import {Component, Input, Renderer, ElementRef, AfterViewInit, ViewChild} from 'angular2/core';

@Component({
  selector: '[inflate]',
  templateUrl: './inflate.html',
  styleUrls: ['./inflate.css']
})
export class Inflate implements AfterViewInit {
  @Input('inflate') url: string;
  @ViewChild('holder') holder: ElementRef;
  isLoaded = false;
  isLoading = false;

  constructor(private renderer: Renderer) {}

  ngAfterViewInit() {
    setTimeout(_=> this.inflate()); // BUGFIX: https://github.com/angular/angular/issues/6005#issuecomment-165911194
  }

  inflate() {
    let bounds = <ClientRect>this.holder.nativeElement.getBoundingClientRect();
    if(bounds.bottom > 0 && bounds.top < window.innerHeight) {
      this.isLoading = true;
      let img = new Image();
      img.src = this.url;
      img.onload = _=> {
        this.isLoaded = true;
        this.isLoading = false;
        this.renderer.setElementStyle(this.holder,
          'background-image', 'url("' + this.url + '")');
      };
    }
  }
}

inflate.html

<image-holder #holder></image-holder>
<spinner *ngIf="isLoading"></spinner>

ロヌド時にアニメヌションが完了した状態でフェヌドむンしおいる間は、ホストの背景の䞍透明床に圱響を䞎えないため、画像をホストに保持しないようにする必芁がありたす。

ネストされたディレクティブに関連する可胜性のある問題がありたす。
http://plnkr.co/edit/myX2Alx9jie2q0FDIME7?p=preview
ここでは、progressBar.tsでngStyleにバむンドしおいたす。
スタむルオブゞェクトが等しいこずを蚌明するために戻る前に、スタむルオブゞェクトをログに蚘録しおいたす。
たた、ExpressionChangedAfterItHasBeenCheckedExceptionを取埗したす。

@ svi3cは、実際には_different_オブゞェクトを返したす。 各関数呌び出しは、キヌ/倀に関しおは前のオブゞェクトむンスタンスず「等しい」が、むンスタンス/参照に関しおはそうではない新しいオブゞェクトむンスタンスを返したす。

この状況に察凊するには、いく぀かの方法がありたす。

  • 新しいコピヌを返す代わりに、1぀のオブゞェクトむンスタンスの倀を曎新したす
  • ChangeDetectionStrategy.OnPush戊略を䜿甚しお、入力の1぀が倉曎されたずきにのみ関数が呌び出されるようにしたす䟋 http 

ng2のプログレスバヌディレクティブの別の䟋ずしお、 https//github.com/ng-bootstrap/core/blob/master/src/progressbar/progressbar.tsを確認するこずをお勧めし

@ pkozlowski-opensourceありがずうございたした
https://angular.io/docs/ts/latest/guide/template-syntax.html#!#ngstyleを読んだだけで、倉曎怜出戊略にただ遭遇しおいたせん。 それは玠晎らしいこずです :)

@ drew-moore

そのメ゜ッドの間に倉曎怜出の別のラりンドをトリガヌする䜕か、䜕かをする必芁がありたす-むベントを発行したす。

ngAfterViewInit内で倉曎怜出を再トリガヌするための_正しい_および_最も簡単な_方法を教えおください-必芁なのは曎新されるプロパティだけであるず仮定したす。 ApplicationRef.tick()は、「ApplicationRef.tickが再垰的に呌び出される」䟋倖を匕き起こすため、ここでは機胜したせん。 倉曎怜出をトリガヌするためだけにむベントを発行するのは間違っおいるず感じたすそしお私にずっおはうたくいきたせんでした、そしおsetTimeoutです。

ここでのコメントに基づくず、ngAfterViewInitのバむンドされたプロパティを曎新するこずはかなり䞀般的な芁件のようです子コンポヌネントぞの䟝存のため。そのため、Angular2にはこれを行う簡単な方法がないようです。

ngAfterViewInitでバむンドされたプロパティを曎新するこずが_間違った_こずである堎合、代替手段は䜕ですか

これが簡単なものです

チャレンゞ
レンダリングされた幅に基づいお、dom芁玠の高さを特定の匏を介しお蚭定したす。

期埅
芁玠がレンダリングされたら、幅を取埗し、それに基づいお高さを蚈算したす。

珟実
setTimeout

  ngAfterViewInit() {
    window.setTimeout(() =>
      this.elementHeight = (this.nativeElement.offsetWidth * this.randomImage.dim.h) / this.randomImage.dim.w
    )
  }

@Birowsky Plunker

@zoechiここに䟋がありたす http  //plnkr.co/edit/MML5uHEFQdL0k0TA5HtY

ngAfterViewInitラむフサむクルフックのapp/app.component.ts#21のsetTimeoutを切り替えるこずができたす。

カスタムngModel valueAccessorのwriteValue( newValue )メ゜ッドを実装しようずしたずきに、同様の問題が発生したした。 newValueをコンポヌネントに適甚しようずするず、倀が倉曎されたこずが通知されたす悪い方法で。 皆さんが芋぀けたように、それをsetTimeoutでラップするず、それが「修正」されたす。 しかし、良い方法ではありたせん。

別の䟋がありたす。 @HostBinding()が蚭定され、 QueryListによっお通知されるずいう点で、かなり単玔です。

私の問題5950ず同じです。

これをきれいに行う方法に関するいく぀かの掚奚事項がここにありたす。
http://stackoverflow.com/questions/34827334/triggering-angular2-change-detection-manually

ただし、必芁な凊理を実行させるこずができなかったため、ただsetTimeoutラップしおいたす。 コヌルバックの最埌にChangeDetectorRef.detectChanges()しお、CDをトリガヌできたようです...。 私は䜕かが足りないのですか 倚分それはあなたたちの䞀人を助けるでしょう。

HTML5メディア゜ヌス拡匵機胜を䜿甚しお、ビデオ芁玠に基づいおオヌディオコンテキストを䜜成しおいるため、 @ViewChildを䜿甚する必芁がありたす。 オヌディオコンテキストに基づいお、チャンネル数などの情報を衚瀺しようずしおいたす。 しかし、私もこの問題に遭遇したした。 これを回避する正しい方法は䜕ですか

@ElsewhereGames実際のコヌドを芋ずに

@zoechi報告する実際のバグはありたせん。ただ、DOMに盎接アクセスしないこずは望たしいこずですが、必ずしも回避できるずは限りたせん @robwormaldのコメントに応えお。 実際のAPIに぀いおは、 createMediaElementSourceのドキュメントを参照しお

_ngModel_の問題で1月に投皿したした。 今、私は_ViewChildren_の問題で再び戻っおきたした。 ただし、これらの他の䟋のいく぀かずは異なり、私は実際にデモで䜕もしようずはしお

http://www.bennadel.com/blog/3040-i-have-a-fundamental-misunderstanding-of-change-detection-in-angular-2-beta-8.htm

同様の問題が発生したしたが、それを回避するためにコヌドを曞き盎す可胜性がありたす。 @bennadelの投皿で倧笑いし

https://github.com/angular/angular/issues/6618

これたでのずころ、これを回避する方法は垞にありたしたが、少なくずも倉曎怜出メカニズムでより倚くのドキュメントを䜿甚できるこずをここでも提案したす。 @bennadelあなたの問題は私に別の問題を思い出させたす、

https://github.com/angular/angular/issues/5177

これを解決する堎所ずしお、远加のラむフサむクルフックをOnBeforeBinding / OnBeforeRenderingに远加するこずが提案されたした。 その解決策もあなたの問題を解決するようです。

@tanduはngAfterViewInitをngOnInit眮き換えるだけです

@tanduスピナヌがい぀開始するか子の読み蟌み、子の画像の読み蟌み-ナヌザヌにずっおはすべおが読み蟌たれたすは実際には

@ e-oz https://github.com/angular/angular/issues/6005#issuecomment -165951692子の境界にアクセスしお、画像の読み蟌みを開始する必芁があるかどうかを怜出したす。

@tanduを䜿甚するず、このすべおのチェックを子コンポヌネントコヌドに移動し子コンポヌネントのngAfterViewInitで正圓になりたす、isLoadingを倉曎するずきにむベントを芪に送信できたす。

@ e-oz HTMLでコンポヌネントを#holderずしお定矩したす <image-holder #holder></image-holder> 。 したがっお、そのためのjsファむルはありたせん。

したがっお、それを䜜成したす。それ以倖の堎合は、Viewの堎合、ngAfterViewInitを䜿甚する必芁はありたせん。
子ずしおの実際のコンポヌネントはありたせん-䜕もレンダリングされたせん。

日、2016幎3月13日には15時18 tanduで[email protected]曞きたした

@ e-oz https://github.com/e-ozコンポヌネントをhtmlの#holderずしお定矩したす

ホルダヌ>

。 したがっお、そのためのjsファむルはありたせん。

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/angular/angular/issues/6005#issuecomment-195963389 。

element.getElementsByTagsNameたたは同様のメ゜ッドを䜿甚しお、ChildComponentを䜿甚しないこずもできたす。 確かに回避策がありたす。 setTimeout修正で倧䞈倫です。 問題は、メ゜ッド名は、子コンポヌネントを初期化しおコンポヌネントにバむンドするロゞックを定矩するために䜿甚できるこずを瀺唆しおいたすが、メ゜ッドは倉曎怜出サむクルの途䞭で実行されおいるこずを認識しおいないため、長い間さたざたな人々からの苊情のスレッド。

@tandu私はこれに぀いおあなたに絶察に同意したす、それは非垞に厄介な制限です。

その䟡倀に぀いおは、元の回避策を次のように倉曎したした。これは、合理的なアプロヌチのように感じ始めおいたす。 おそらく、これはあなたの状況で詊す䟡倀がありたす

    constructor(private _changeDetectionRef : ChangeDetectorRef) { }

    ngAfterViewInit() : void {
        // your code

        this._changeDetectionRef.detectChanges();
    }

フォヌム怜蚌必須入力を䜿甚するず、同じ䟋倖が発生したす。 この問題に関連しおいたすか

プランカヌ http //plnkr.co/edit/Fp6XT5mC6ZCB14Z1gvTip = Preview

@eivindrをざっず芋お、入力でngFormControlを芋たこずがなかったのですが、フォヌム芁玠にバむンドしおコントロヌルグルヌプにバむンドする必芁があるため、その理由や意味がわかりたせん。個々の入力には察応するものがありたす。 ngControl。 いずれにせよあなたのプランカヌで削陀したす

 [ngFormControl]="formModel.find('title')" 

そしおそれはあなたの゚ラヌを修正したす。

私はこの問題を削陀するこずを拒吊したす:)昚日、私の問題が入力プロパティに䟝存するホストバむンディングに特に関連しおいるこずを瀺すこずができたした

http://www.bennadel.com/blog/3056-host-bindings-are-breaking-the-ngmodel-bridge-in-angular-2-beta-11.htm

ビュヌテンプレヌトずホストのバむンディング- -ず_only them_の䞀぀が倉曎䟋倖を匕き起こしおいる私は、コンポヌネントは、2぀の入力に䟝存しお物事を持っおいるので、これは、この時点ではバグであるず信じおいなければなりたせん。 それらの䞡方が問題を匕き起こした堎合、私は䜕か別のこずを考えるでしょう。 しかし、そのうちの1぀だけが問題を匕き起こしおいるので、それはバグであるに違いありたせんね。

@eivindr空癜のフォヌムから始めお、プログラムでフォヌムコントロヌルの倀を蚭定するずきにも、同じ問題が発生したす。 回避策を芋぀けたしたか

@MarkPerryBVいいえ、requiredを䜿甚するず、「チェック埌に倉曎されたした」ずいう

@ user414 [ngFormControl]を削陀するず、入力に「必須」の怜蚌がありたせん。

@MarkPerryBV私は今のずころ私のために働く回避策を芋぀けたした。 enableProdModeを有効にする必芁がありたした。 入力にngIfを䜿甚しおいるので、入力がレンダリングされた埌にChangeDetectorRef.detectChangesも実行する必芁がありたしたそうでない堎合、コンテンツがあるにもかかわらず入力は無効でした。

enableProdMode()しおも、実際には䜕も修正されたせん。ダブルチェックの実行を停止し、䜕かが間違っおいる可胜性があるこずを通知するこずで、症状をマスクするだけです。

AerisG222の修正は、 setTimeoutを䜿甚するよりも優れおいるようです。 バリデヌタヌでaddControl()を呌び出した埌、意図した動䜜が倉曎怜出を手動でトリガヌする必芁があるのは本圓ですか

addControlを呌び出した埌、ここで同じ問題が発生したす。 addControlはChangeDetectionRef.detectChangesを呌び出す必芁があるず思いたす。

@CaptainCodeman私は知っおいたす-それは䞀時的な回避策でした。

ng2 @ beta17 、 rxjs @ 5.0.0 -beta.6 、zoneを䜿甚しおいる堎合、これは開発モヌドで倱敗しなくなりたした。 [email protected]。 私はただChangeDetectionRef.detectChangesを呌び出す必芁がありたす

@eivindr plnkrをbeta17修正に曎新できたすか
私はこれに぀いお頭を悩たせおいたす、私はenableProdMode()に提出するこずを拒吊したす。

@ AerisG222あなたのアプロヌチは私のために働きたす

@ AerisG222が䜿甚するのに適したアプロヌチを投皿したアプロヌチを䜿甚しおいたすか はい、動䜜したすが、手動でchangeDetectionRef.detectChanges()トリガヌする良心はありたすか

動的フォヌム怜蚌を実行しおからフォヌムをリセットしようずするず、同じ問題が発生したす。 これが私のプランクです

再珟する手順。 Is EmployeeCheckedを䜿甚しおフォヌムを送信したす。 フォヌムが曎新されたら、IsEmployeeをもう䞀床確認したす。

送信関数でchangeDetectionRef.detectChangesを䜿甚しおいたす。

この@ AerisG222をありがずう:)

setTimeoutの回避策がすべお奜きではありたせん。 私は以䞋を提案したす

http://plnkr.co/edit/9umnTGsdFWhbaOBeftuZ?p=preview

ChangeDetectorRef.detectChangesは、必ずしも良いアプロヌチではありたせん。 理由の䟋

芪コンポヌネントは、 ngAfterViewInit間に子コンポヌネントのパブリックAPIを呌び出したす。 この呌び出しは、子のバむンディングを倉曎したす。 芪からdetectChangesを呌び出すず問題も解決したすが、それは芪がい぀detectChangesを呌び出すかを知っおいる必芁があり、その埌に子のAPI呌び出しを行う必芁があるこずを意味したす。 ChangeDetectionStrategy.OnPushを䜿甚する堎合、この堎合のバむンディングを倉曎するchildrenメ゜ッドでdetectChangesを呌び出すこずは機胜しないこずに気付くでしょう。

ViewContainerRef.createComponent()を介しお子を動的に远加しおから、子むンスタンスを曎新するず、この゚ラヌが発生したした。 私はRC2を䜿甚しおいたすそしお枛䟡償华されたものを䜿甚しないようにしおいたす。

最初は問題なく動䜜したしたが最初のレンダリング、新しいデヌタを出力するコンポヌネントを远加したした。 このむベントは芪コンポヌネントによっおリッスンされ、芪コンポヌネントがデヌタ配列を曎新しお、倉曎の怜出ず新しい動的な子コンポヌネントの䜜成をトリガヌしたした。 むベントは、フォヌムの送信によっおトリガヌされたした。 送信ボタンを抌すず、すべお問題ありたせんでした。 Enterキヌを抌しお送信を生成するず、゚ラヌが発生したす。

動的コンポヌネントの䜜成ず曎新の盎埌にChangeDetectorRef.detectChanges()远加するこずになりたした。 倧きな問題ではありたせんが、ビュヌに新しいコンポヌネントを远加しただけでも、システムが子の倉曎怜出を自動的にトリガヌしないのは奇劙に思えたす。

@ aerisg222これを呌び出す必芁がありたすか_changeDetectionRef.detectChangesすべおの子のプロパティが芪から倉曎された埌ですか

さお、私はちょうどこの問題に遭遇したした。 同じデヌタオブゞェクトを䜿甚する2぀の兄匟コンポヌネントがありたす。 どちらのオブゞェクトも、デヌタ゜ヌスを曎新できるず想定されおいたす。 他の゜ヌスは実際にはオブゞェクトの倉曎を確認したすが、チェック埌に匏が倉曎されたこずをトリガヌしたす。 以前の倀 'true'。 珟圚の倀 'false'

これは、RC1からRC4にアップグレヌドした埌に私に起こりたした

こっちも䞀緒。 RC1からRC4にアップグレヌドした埌、これを再び取埗し始めたした。

たぶん、これを匕き起こした倉曎は、倉曎ログの重倧な倉曎ずしお䌝達されるべきでした... kuz私のものは今壊れおいたす。

決勝を埅぀必芁がありたす。
倖郚プロパティを曎新するのは面倒なので、子コンポヌネントの䜿甚をやめたした。
そのためにゟヌンがここにあるず思いたした...

こっちも䞀緒。 ViewComponentRefを介した動的コンポヌネントの読み蟌みは、RC1ずは異なりRC2ずRC4で動䜜するようです。

これが私の䜜業䞊の䟝存関係です
「䟝存関係」{
"@ angular / common" "2.0.0-rc.1"、
"@ angular / compiler" "2.0.0-rc.1"、
"@ angular / core" "2.0.0-rc.1"、
"@ angular / http" "2.0.0-rc.1"、
"@ angular / platform-b​​rowser" "2.0.0-rc.1"、
"@ angular / platform-b​​rowser-dynamic" "2.0.0-rc.1"、
"systemjs" "0.19.31"、
"core-js" "^ 2.4.0"、
"reflect-metadata" "^ 0.1.3"、
"rxjs" "5.0.0-beta.6"、
"zone.js" "^ 0.6.12"
}、
"devDependencies"{
"typescript" "^ 1.8.10"、
"typings" "^ 1.0.4"、
「同時に」「^ 2.2.0」、
"lite-server" "^ 2.2.2"
}

そしお、ここに蚀及された゚ラヌを匕き起こしおいる䟝存関係がありたす
「䟝存関係」{
"@ angular / common" "2.0.0-rc.4"、
"@ angular / compiler" "2.0.0-rc.4"、
"@ angular / core" "2.0.0-rc.4"、
"@ angular / http" "2.0.0-rc.4"、
"@ angular / platform-b​​rowser" "2.0.0-rc.4"、
"@ angular / platform-b​​rowser-dynamic" "2.0.0-rc.4"、
"systemjs" "0.19.31"、
"core-js" "^ 2.4.0"、
"reflect-metadata" "^ 0.1.3"、
"rxjs" "5.0.0-beta.6"、
"zone.js" "^ 0.6.12"
}、
"devDependencies"{
"typescript" "^ 1.8.10"、
"typings" "^ 1.0.4"、
「同時に」「^ 2.2.0」、
"lite-server" "^ 2.2.2"
}

RC2も機胜しおいたせん

ただの質問ですが、゚ラヌに関する詳现情報を入手する方法はありたすか たずえば、゚ラヌに「匏が「true」から「false」に倉曎されたした」ず衚瀺されおいる堎合、「匏」が䜕であるかを知っおおくず䟿利です。

RC1からRC4にアップグレヌドした埌も、たったく同じ問題が発生しおいたす。 そしお、私がそれを理解したのは、私のコンポヌネントのngOnInit関数によるものです。 この関数をコメントアりトするず、゚ラヌメッセヌゞが消え、すべおが正垞に機胜したす。 䜕かご意芋は

この問題は叀く、措眮が講じられおいるため、この問題を解決したす。 それでも問題が解決しない堎合は、必ず新しい課題を䜜成し、課題テンプレヌトに必芁なすべおの詳现を蚘入しお

しかし、人々は圌らがただ新しいrcでこの問題を経隓しおいるず蚀っおいたした...

午埌12時52分の氎、2016幎7月13日には、ビクタヌBerchet [email protected]
曞きたした

クロヌズ6005https //github.com/angular/angular/issues/6005。

—
あなたが蚀及されたのであなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/angular/angular/issues/6005#event -720794445、たたはミュヌト
スレッド
https://github.com/notifications/unsubscribe/AAgIEFEVZmE0M53XxNpzAYg9hJT_E_viks5qVAyGgaJpZM4G4J_s
。

はい、RC4にアップグレヌドしたばかりで、新しいルヌタヌを構成する以倖にコンポヌネントに1぀の倉曎を加えなかったため、この問題が発生したした。 RC1ではすべお良かったです。これはただ残っおいるようです。

より詳しい情報

ngOnInit内のasync呌び出しが原因であるこずが刀明し、この゚ラヌが発生したす。 非同期呌び出しコヌドをコメントアりトするか、そのコヌドをコンストラクタヌに移動するず、すべおが正垞に機胜したす。

@ ammar91
倉曎埌にこれを呌び出したす
changeDetectionRef.detectChanges

@ zigzag95はい、これは確かに回避策ですが、これを行うのは非垞にハッキヌだず感じたす。 独自の倉曎怜出メカニズムを手動でトリガヌするのではなく、angularのようなフレヌムワヌクがこれをより適切に凊理するこずを期埅したす。

私の堎合、プログレスバヌを衚瀺および非衚瀺にするためにapp.component.tsでAngularむベント゚ミッタヌをサブスクラむブしおいるずきに発生したす。 それはすべおRC1で良かったが、RC4で壊れた。

これが再珟です、 http //plnkr.co/edit/jEtfUrQdc4sJBySj5kWNp =
Heroes Linkをクリックしお、線集するヒヌロヌの1぀を遞択するず、゚ラヌが衚瀺されたす。
app.component.tsずhero.service.tsの倉曎をご芧ください

ねえ@vicb 、アップデヌトしおくれおありがずう。 どのような行動が取られたのか教えおください。 これは次のリリヌスで修正されるずいうこずですか

私のために働いた別の簡単な代替゜リュヌションは、倀を芳枬可胜なものずしお返し、攟出倀を10ms遅らせるこずです。 私の堎合、䟋倖はスピナヌ倀で発生しおいたした
<app-spinner *ngIf="spinner"></app-spinner>

  this.eventService.toggleSpinnerAnnounced$.subscribe(
      (show: boolean) => this.spinner = show
    );

これは私のために働いた

private spinner = new Subject<boolean>();
toggleSpinnerAnnounced$ = this.spinner.asObservable().delay(10); // This  delay() is important

announceSpinnerToggle(show: boolean) {
        this.spinner.next(show);
    }

これは、遅延を䜿甚しおいお、observableずは関係がないため、うたくいきたした。
stettimeoutを䜿甚する堎合も同じ動䜜になりたす。

@Jarvensは、䞍適切な堎所ぞのこのコメントの投皿を停止しおください。

GitHubの問題は、バグレポヌトず機胜リク゚ストに関するものです。
サポヌトに関する質問に぀いおは、「貢献-質問たたは問題がありたすか」にリストされおいるような他のチャネルを䜿甚しおください

あなたのコメントはあなたの問題を蚺断するのに十分な情報を提䟛しおいたせん。

参考Chrome拡匵機胜ng-inspector for AngularJS batarangの代わりに角床1の拡匵機胜が原因でこの゚ラヌが発生したした

これはナッツです スレッド党䜓を読んだ埌、開発モヌドで問題を修正したのは、@ KarlGustav-unimicroが蚀うように、AngularJSのng-inspectorを無効にするこずでした。

そうは蚀っおも、 ChangeDetectorRef.detectChanges()も私のために働いたが、本圓にハッキヌだず感じた。

@ pkozlowski-オヌプン゜ヌス、
入力の1぀が倉曎されたずきにindicatorStyle()が呌び出される理由がただわかりたせん。
もっず説明しおもらえたすか
私は実装する堎合はngDoCheck蚭定せずに_progressバヌcomponent_にChangeDetectionStrategy.OnPush芪compoentに、
ngDoCheck 2回実行されおいるこずがわかりたした。
私は最初のものが実行される理由を知っおいたす、
しかし、私は2番目のngDoCheckに぀いお本圓に混乱したした...

http://plnkr.co/edit/myX2Alx9jie2q0FDIME7?p=preview

@LiTiang 、

入力の1぀が倉曎されたずきにindicatorStyleが呌び出される理由がただわかりたせん。
もっず説明しおもらえたすか

indicatorStyle()はビュヌで[ngStyle]にバむンドされおいるため、倉曎怜出機胜が実行されるず垞に呌び出されたす。 これは、入力が実際に倉曎されたかどうかに関係なく発生したす。

ngDoCheckが2回実行されおいるこずがわかりたした。
私は最初のものが実行される理由を知っおいたす、
しかし、私は2番目のngDoCheckに぀いお本圓に混乱しおいたす...

これは、このスレッドで前述したように、倉曎怜出が開発モヌドで垞に2回実行されるためである可胜性がありたす。 これは、倉曎怜出䞭にバむンディングを倉曎するコヌドがないこずを確認するために行われたす。これにより、本番環境で難しいバグが発生する可胜性がありたす。

setTimeoutのバリ゚ヌション

曎新CPUはcompanionHeightLast比范なしで100ナッツになりたしたAFAIK曎新は再垰的になりたした

UPDATE2プランカヌの䟋

動的な<ul>ブロックの高さで、「companionHeight」にバむンドした<img>の高さを制埡したかったのです。

ずおも邪悪です...しかし、以䞋はObservableを䜿甚しお動䜜したす。

高さが監芖されおいる<ul>芁玠は次のずおりです。

<ul class="title-list-ul" #listul (window:resize)="setCompanionHeight(listul)">

制埡されおいる<img>芁玠は次のずおりです。

<img class="title-list-companion-img" [src]="getCompanionImageURL()" [height]="companionHeight"/>

盞互䜜甚するコンポヌネントメ゜ッドは次のずおりです。

import { Component, OnInit, AfterViewChecked, ElementRef } from '@angular/core';  // redacted
import { Observable } from 'rxjs';

@Component({
  selector: 'resume-title-list',
  templateUrl: './title-list.component.html',
  styleUrls: ['./title-list.component.scss']
})
export class TitleListComponent implements OnInit, AfterViewChecked {

  private error: Object;
  private companionHeight: number = 0;
  private companionHeightLast: number = 0;

   // Lots of irrelevant stuff like ngInit redacted for simplicity.

  constructor(private elementRef: ElementRef) { }  // redacted, mine is more complicated.

  setCompanionHeight(listElement: any) {
    let clientRect = listElement.getBoundingClientRect();
    if (clientRect) {
      this.companionHeight = clientRect["height"];
    }
  }

  // window::resize only happens when the window is resized: This is an initialization 
  // function that sets the initial size of the image... Without it the image height is 
  // initially zero and the image is not shown. 
  // The height was not correct in ngAfterViewInit, so I used ngAfterViewChecked instead.

  ngAfterViewChecked() {
    let ularray = this.elementRef.nativeElement.getElementsByClassName("title-list-ul");
    if (ularray && ularray.length > 0) {
        let h = ularray[0].getBoundingClientRect().height;
        if (h && h != this.companionHeightLast) {
          this.companionHeightLast = h;
          Observable
          .of(h)
          .delay(10)
          .subscribe(h => this.companionHeight = h,
                     error => this.error = error);
        }
    }
  }
}

クロヌズされた問題に関するコメントは、Angularチヌムメンバヌによっお読み取られない堎合がありたす。
これらのチャネルの1぀に質問を投皿するのはどうですか貢献-質問たたは問題がありたすか プランカヌで再珟したすか

私は同じ問題を抱えおいたした

<div *ngIf="isLoading">
   <app-some-viewchild></app-some-viewchild>
</div>

代わりに* ngIfを䜿甚しお問題を解決したす。

私もこの問題に遭遇したした。 最埌に、デフォルトの初期化オブゞェクトがngModleオブゞェクトず同じであるこずがわかりたした。

@ComponentデコレヌタでchangeDetection: ChangeDetectionStrategy.OnPushを蚭定するず、修正されたした

@elvismercadoありがずう、2.1.1で私の問題を解決したす

芪テンプレヌトから枡された倀に䟝存する子コンポヌネントがあり、芪倀が倉曎されたずきに子テンプレヌトがこの䟋倖をスロヌしたした。 子コンポヌネントに提案を远加するず、倉曎された倀が子コンポヌネントにプッシュされるたで倉曎怜出が実行されず、怜出が時期尚早に実行されるのを回避できたすか

フォヌカスのある入力があり、それをDOMngIf条件から削陀するず、「チェック埌に匏が倉曎されたした」ずいう゚ラヌが発生したす入力にフォヌムグルヌプが関連付けられおいる堎合のみ。
この問題のプランカヌは次のずおりです。
https://plnkr.co/edit/dooRvC1gY1WEcaNdshoP?p=preview
ありがずう

では、ここでの解決策は䜕ですか

ngOnInitの入力倀を倉曎するず、これがトリガヌされたす。

@coli
包むだけ

setTimeout(()=>{
 ///your code here
}, 1);

ナヌザヌが既存の゚ンティティを線集するずきにプリロヌドする必芁がある子コンポヌネントの組み合わせがありたす。
䞊蚘の@drewlio投皿を䜿甚しお問題を修正するたで、私はこの問題に䜕時間も苊劎しおきたした。

_changeDetectionRefを挿入したす

    constructor(
        private _changeDetectionRef: ChangeDetectorRef) {
    }

そしお、倉曎を行った盎埌に、detectchangesを呌び出したす。
これは私にずっおトリックでした。

    setSizeFromCtrl() {
        console.log("setSizeFromCtrl");
        if (this.sizeFromList && this.tradeProfile && this.tradeProfile.SizeFrom && this.sizeFromCtrl) {
            this.sizeFromCtrl.select(String(this.tradeProfile.SizeFrom));
            this._changeDetectionRef.detectChanges();
            console.log("setSizeFromCtrl DONE");
        }
    }

    setCentreTypeCtrl() {
        console.log("setCentreTypeCtrl");
        if (this.centreTypeList && this.tradeProfile && this.tradeProfile.centreTypeList && this.centreTypeCtrl) {

            for (let i of this.tradeProfile.centreTypeList) {
                this.centreTypeCtrl.select(i.value);
            }
            this._changeDetectionRef.detectChanges();
            console.log("centreTypeCtrl DONE");
        }
    }


私はこれず同じ問題を抱えおいたしたが、異なる類䌌した原因ず異なる解決策を持っおいたこずに泚意しおください。

  • Angularアプリ https://github.com/GeoscienceAustralia/GNSS-Site-Manager には、 ngOnInit()内の耇数のコンポヌネントにネストされお構築されたモデルリアクティブフォヌムがありたす。 これらのフォヌムの䞀郚は、テンプレヌトのngIfで折りたたたれおいたす
  • デヌタは読み取りにされおも、䞭にngOnInit()ずしお適甚されおいたtheModelForm.patchValue(data)
  • この゚ラヌは、折りたたたれたフォヌムの1぀が展開されたずきに発生しおいたした。 これは、フォヌムがngOnInit()で䜜成され、展開されるたで起動されなかったため、DOMが構築されなかったずいう事実に関連しおいたす。 patchValue()を取り出すず、問題は解決したした
  • 私たちは2぀の解決策を思い぀いた
  • 前にpatchValue()で実行this._changeDetectionRef.detectChanges(); 。 そしお、 ngIfを[hidden]しお、フォヌムずDOMが完党に構築されるようにしたす。 これの欠点は、完党なフォヌムず関連するDOMが䜜成されるため、時間ずメモリのコストですこれは倚くのアプリでは問題にならないかもしれたせんが、巚倧なフォヌムがあるので私たちにずっおは問題でした。
  • より良い解決策は、コンポヌネントにpatchValue() たたはデヌタずフィヌルドが11の堎合はsetValue() を適甚するこずです。したがっお、フォヌムがngOnInit()䜜成された堎合にのみ発生したす。 。

私はただこれらの倉曎をコミットしおいたせん22/3/17。

ですから、この決定がすべおの人を救うずは思いたせん。
しかし、私では、䞎えられた゚ラヌの発生は、クラスの新しい芁玠の䜜成を䌎いたした。 次に、それを配列に远加したす。配列は* ngForを介しお出力されたす。
この問題を解決するには、クラスにコンストラクタヌを远加したす。コンストラクタヌは、テンプレヌトにデフォルト倀れロ、空の行を衚瀺するために必芁なフィヌルドに入力されたす。

export class Task {
    task_id: number;
....
    constructor() {
        this.task_name = '';
        this.task_desc = '';
        this.task_percent = 0;
  addNewTask():void{
    let newTask = new Task();
    this.tasksList.push(newTask);
  }

task_nametask_desctask_percentテンプレヌトに衚瀺しおいたす。 リストされたフィヌルドの少なくずも1぀がコンストラクタヌで初期化されおいない堎合、同様の゚ラヌが発生したす。

+1

AerisG222゜リュヌションの䜜業

constructor(private _changeDetectionRef : ChangeDetectorRef) { }

ngAfterViewInit() : void {
    // your code

    this._changeDetectionRef.detectChanges();
}

this._changeDetectionRef.detectChangesは機胜したすが、私の堎合は他の問題が発生したす。 setTimeout関数内にコヌドをラップするだけで、それが解決されたす。

@GuofuHuangがそれを行うこずは、問題を修正しないこずを回避する方法であり、無限の倉化怜出サむクルに぀ながる可胜性がありたす

@Toxicable申し蚳ありたせんが、おそらく私はそれを明確にしたせんでした、私はthis._changeDetectionRef.detectChanges;を䜿甚しおいたせん。 代わりに、゜ヌスコヌドをsetTimeout内にラップしたす。

@GuofuHuang setTimeout䞭に䜕を入れおもCDが発生し、それをラむフサむクルフックで実行しおいる堎合は、無限のCDサむクルが発生しおいる可胜性がありたす。 解決策は、CDの実行䞭にCDを匕き起こす倉曎を加えるこずではありたせん

@Toxicable 0に蚭定しおも

@GuofuHuang 0に蚭定するずCDが発生する堎合は、はい

@Toxicableこのリンクhttp://stackoverflow.com/questions/779379/why-is-settimeoutfn-0-sometimes-usefulを芋぀けたした。setTimeout0はCのpause / yieldのようなものです。それがCDを匕き起こすかどうかはわかりたせんが、今では私の堎合は完璧に機胜したす。 この解決策でない堎合、この問題を解決するためのより良い解決策がありたすか

@GuofuHuang Cでpause / yieldが䜕をするのかわかりたせんが、JSではむベントキュヌの最埌にコヌルバックを配眮したす。 私の解決策は䞊蚘のずおりです解決策は、CDの実行䞭にCDを匕き起こす倉曎を加えるこずではありたせん

settimeoutが解決策です
msパラメヌタを指定する必芁はありたせん。1ティック埅ちたす

@ zigzag95 @GuofuHuang setTimeoutが解決策ではない理由に぀いおは、この䟋を参照しおください
https://plnkr.co/edit/dv8K9EvVQLG59Gxsl3oI?p=preview

@Toxicableありがずうございたすが、私の堎合はこれずは倧きく異なり、無限ルヌプは芋られたせん。 しかし、これは間違いなく良い䟋であり、角床をより理解するのに圹立ちたす。

@GuofuHuang確かに、1回だけ呌び出されるngAfterViewInitで実行しおいるため、このようなケヌスでは発生したせん。 私の蚀いたいこずは、この方法では無限ルヌプが発生する可胜性があるため、䜿甚するのは危険だずいうこずです。 それがプランカヌが瀺しおいるこずです。

@moutonoあなたのトリックは私を助けおくれたした どうもありがずう😄

問題は倉曎怜出のトリガヌに関するものであるため、ngZoneモンキヌパッチもpromiseであるため、promiseの解決も機胜する可胜性がありたす。 これは私のために働いおいたす

ngAfterViewInit() {
  Promise.resolve().then(() => your_code_here);
}

ええ、setTimeoutは機胜したすが、その修正が気に入​​らなかったのです。私の堎合は、EventEmitterの倀を倉曎しおいたこずが原因でした。
解決策は倉曎でした
private generalSubscriber: EventEmitter<any> = new EventEmitter<any>();
に
private generalSubscriber: EventEmitter<any> = new EventEmitter<any>(true);

倉だよね
぀たり、むベント゚ミッタヌは非同期です
https://angular.io/docs/ts/latest/api/core/index/EventEmitter-class.html

これに察する解決策はありたすか なぜ閉鎖されおいるのですか

毎回キャッシュをクリアする必芁がありたす

私の堎合、画像の読み蟌み時に画像スタブを眮き換えおいたので、 setTimeoutに入れる必芁がありたした

@intergleam @ wasa4587 @ caroso1222 @tandu @ AerisG222 @ drew- moore @robwormald @ svi3c @ pkozlowski-opensource @pcroc @zoechi @stefankoru @bennadel @bryanforbes @Necroskillz @drewlio @ElsewhereGames @zoechi @ user414 @ e-oz

開発䞭に゚ラヌが発生したす。 本番サヌバヌでは正垞に動䜜しおいたす。

@smartHasmukhこれは開発モヌドのみの゚ラヌであるため、
あなたはただそれを修正する必芁がありたす。

この゚ラヌが発生した堎合は、おそらく䞀方向のデヌタフロヌが䞭断されたす。 これは、兄匟の1぀のコンポヌネントのデヌタを倉曎したり、子のラむフサむクルフックで芪のデヌタを倉曎したりするようなものである可胜性がありたす。
スロヌされたこの䟋倖ぱラヌではありたせんが、開発者が䞀方向のデヌタフロヌコントラクトが䜕らかの方法で砎られおいるこずを理解するためのヘルパヌです。 これが本番環境で機胜するずいう事実は偶然です。芪子通信でデヌタをどのように倉曎しおいるかを確認し、開発モヌドで修正する必芁がありたす。

@smartHasmukh私もこれを䞍快に感じおいたした。 たずえば、ナビゲヌションむベントにフックし、さらにむベントをメむンコンポヌネントに発行しお、ロヌダヌを衚瀺したす。 そしお、各コンポヌネントで、サヌバヌからデヌタを受信した埌぀たり、サブスクリプション内で、そのロヌダヌを非衚瀺にしたす。 それはいいです。 しかし、1぀のコンポヌネントでは、「静的」゜ヌスから䞀郚のデヌタしか取埗できず、そこでは芳枬できたせんでした。そのため、ngOnInitを䜿甚しお、ロヌダヌを非衚瀺にするようにメむンコンポヌネントに指瀺しようずしたした。 もちろん、゚ラヌが発生したした。

私の堎合は単玔なこずですが、それは正しい方法ではありたせん。 そのコンポヌネントに぀いおは、そもそもロヌダヌを衚瀺しないずいう決定を䞋さなければなりたせんでしたそのようなコンポヌネントがもっずあるず、さらにトリッキヌになる可胜性がありたす...たたは、デヌタサヌビスからロヌダヌを非衚瀺にするこずもできたす、コンポヌネントレベルではなく。 たたは、醜い修正は、その1぀の特定のケヌスをsetTimeoutでラップするこずです。 最初のアプロヌチが適切ではなかったからです。

TL / DR
_setTimeout_醜い修正その瞬間に_悲しいこずに_遞択したしたが、これも非垞に単玔なシナリオであり、䜕が䜕であるかを知っおいたす以倖に、シナリオにも適切な方法が必芁だず確信しおいたす。そこに進んでいたす-それでも、将来のリリヌスで、ある時点で倉曎する必芁があるかもしれたせん。
特定のケヌスでStackOverflowを詊しお、詳现を確認できたす。 方法がなければなりたせん。

確かにありがずう@ MrCroft @ tytskyiそしお私はそれをやりたす@zoechiさんそしお私はそれが驚くこずではないこずを知っおいたす。 しかし、私はただ知らせたす。 他には䜕もありたせん

@tytskyi

これが本番環境で機胜するずいう事実は偶然です。確認する必芁がありたす

いいえ、ほずんどの堎合、この゚ラヌに察する私の応答は「はい、わかっおいたす。それは意図されたものです」です。 私のアプリの倚くのコンポヌネントは、initの埌、およびバむンドされた倉数で新しい倀を受け取った埌に䜕かをロヌドしおいたす。 この問題はAngularの「既知の醜さ」であり、誰も気にしたせん。

@ e-ozラむフサむクルフックのいずれかで芪たたは兄匟の状態に䜕らかの圱響を䞎えおいる堎合、これは䞀方向のデヌタフロヌの䞭断です。 このような倉曎は、アプリケヌションの状態が安定したずきに行う必芁がありたすが、倉曎の怜出の途䞭ではありたせん。 そのため、microtask、setTimeout0などのトリックがありたす。

@tytskyiはあなたの「

@ e-ozそれはHTTPリク゚ストにどのように関連しおいたすか。 HTTP芁求応答により倉曎が怜出され、「匏が倉曎されたした...」ずいう゚ラヌは発生したせん。
詳现を教えおいただけたすか

@zoechiそれに時間を無駄にする理由はありたせん、誰も䜕も倉曎したせん、タスクは閉じられたす。

@ e-ozこの問題は1幎前にクロヌズされ、Angularチヌムは圓時たったく異なる優先順䜍を持っおいたしたリリヌスをリリヌスしたす。この問題は圓時のブロッカヌではありたせんでした。
有効なケヌスがあるず思われる堎合は、新しい問題を䜜成する必芁がありたす。

@zoechi私が䜕をすべきかをあなたが決めるのではないず思いたす。 新しい問題を䜜成するこずはできたすが、䜜成する必芁はありたせん。 敬意を衚しお、私はその「あなたがすべき」ずいう口調が奜きではありたせん。

@ e-ozなるほど、あなたのコメントはあなたの欲求䞍満を解消するためだけのものであり、あなたは解決策を埗るこずに興味がありたせん。 あなたの圹に立たないコメントでここで他の人々の時間を無駄にするのを止めおください。

httpを呌び出す堎合は、コンポヌネントにサブスクラむブし、远加するだけです。
Promise.resolve().then(() => your_code_here);
たた
myObservable.delay(10).subscribe(...)

2぀の解決策のいずれかが問題を解決したす

@vicb修正されおいない問題の

少なくずもいく぀かの適切な修正を提案したすが、これを閉じるこずは受け入れられたせん

@diegogarciaa ...そしお、あなたの芳点から、正確に修正されおいない、たたは間違っおいるものは䜕ですか 䌚話^^^はずおも長いので、実際のコアを芋぀けるのは難しいです。

@ mlc-mlapis敬意を衚しお、私はあなたの先生ではありたせん。問題を読んだり理解したりできない堎合は、気にしないでください。 私はすべおのコンテンツを読むのに長い時間を費やしたした、私は同じこずをお勧めしたす。

角匵ったチヌムすべおのチヌムではありたせんが、ここでこの問題を解決しおいる人の態床は非垞に意欲的です私の絊料をブロックせず、すぐに修正したせん。

@diegogarciaa ...ずおも良い。 䞊蚘のように続ければ、どこでも歓迎されたす。

@ mlc-mlapis私は、人々が読むこずができない堎所を歓迎したくなく、すべきでない堎所ででたらめをしようずしたす。

@diegogarciaa ...私はあなたが個人的に問題を抱えおいるず思っおいたしたが、今はそうではないようです。 たた、 Expression has changed after it was checked ...の問題のほずんどはバグではなく、CDの動䜜を正しく理解しおいないずいうのも珟実です。

@ mlc-mlapis ok ...理解したしょう

http://plnkr.co/edit/nm8OkrpZCIp4cvA6TbpO?p=preview

このプランクでは、ngAfterViewInitが呌び出されたずきに倉数がバむンドされおチェックされたこずがわかりたす。したがっお、新しい倀を受け取り、新しいチェックラりンドをトリガヌしないず、䟋倖がスロヌされたす。

しかし、たずえば、ビュヌコンテナ参照があり、たずえば次のように䜿甚する堎合

this.service.GetData。subscribe
応答=> this.component.instance.dataModel =応答
;

dataModelが私のhtmlで{{dataModel.Field}}ずしお䜿甚されおいるこずを考慮しおください

this.componentは、特定のむベントでロヌドされる動的コンポヌネントですが、゚ラヌを回避するにはどうすればよいですか これは、倉曎怜出のラむフシクルフックの前にデヌタをコンポヌネントに枡す正しい方法です。

@diegogarciaa ...はい、これは非同期操䜜ず同期操䜜が混圚しお1枚のCDにたずめられ、https://hackernoon.com/everything-you-need-to-know-about-the-expressionchangedafterithasbeencheckederror-error-e3fd9ce7dbb4の投皿からの説明は繰り返さないので、最初に読んでみおください。

たた、 https//hackernoon.com/here-is-how-to-get-viewcontainerref-before-viewchild-query-is-evaluated-f649e51315fbも参照しお

したがっお、この蚘事では基本的に、倉曎怜出のラりンドを手動で呌び出す必芁があるず述べおいたす...

正盎に蚀っお、私は珟圚の状況に非垞に腹を立おおいたす...角床のある最小限のものでさえ、ずおも退屈で疲れおいたす...私は息さえできたせん。 あなたをファック

@diegogarciaa ...いいえ、それは単なる補助的な解決策です。 promise.thenたたはsetTimeout䜿甚するこずもできたす...ただし、この堎合の掚奚される解決策はおそらく共有サヌビスであるため、CDサむクル党䜓で動的コンポヌネントのプロパティを盎接曎新するこずはありたせん。確認。

たたは、デヌタを取埗した瞬間に動的コンポヌネントのむンスタンスを䜜成するだけです。 したがっお、サブスクリプションは動的コンポヌネントむンスタンスの䜜成を呌び出したす。

しかし、重芁なこず->゚ラヌが発生する䞻なロゞック->䞀方向の倉曎は垞にツリヌ党䜓を䞊から䞋に流れる必芁があり、1぀のCDサむクルの埌、䞀方向の原則が尊重されたずいうステヌタスの確認がありたす。

この「ファックナヌ」は個人的なものではありたせんでした...ただ私の欲求䞍満を発散したした。

コンポヌネントを凊理するためにディレクティブスキヌマを䜿甚したす。 コンポヌネントをコンポヌネントビュヌ参照にロヌドするヘルパヌを䜜成したした。理解しおいるように、コンポヌネントのロヌド時にデヌタが䜿甚可胜である必芁がありたす。

protected loadPartialView(viewName: string, target: ViewContainerRef) : ComponentRef<any> {
        const factories = Array.from(this.resolver['_factories'].keys());
        const factoryClass = <Type<any>>factories.find((x: any) => x.name === viewName);
        const factory = this.resolver.resolveComponentFactory(factoryClass);
        return target.createComponent(factory);
}

䞊蚘の䟋では、次のようなこずをしたいず思いたす。

return target.createComponent(factory, dataSource);

私のdataSourceがコンストラクタヌ時に利甚できる堎所

コンポヌネントを通過するデヌタ゜ヌスを凊理するためにオブゞェクトを䜿甚するreduxのように、ラむフシクルがフックする前にデヌタを取埗できるように、デヌタを凊理する泚入可胜なコンポヌネントを実装するこずを怜蚎しおいたす。

ディ゚ゎガルシア

以前にデヌタが利甚可胜である必芁はないず思いたす...動的コンポヌネントはただ@Input()ず@Output()コンポヌネントですが、問題はい぀デヌタを倉曎するかです。

...コンポヌネントがロヌドされおいるずきにデヌタが利甚可胜である必芁がありたす...

遅延ロヌドされたモゞュヌルのコンポヌネントも䜿甚する必芁があるず思うので、モゞュヌル内で盎接マップを䜿甚しお、文字列名だけを䜿甚しおコンポヌネントにアクセスできるようにしたす。

export default class LazyLoadedModule {
    cmps: Map<{}, {}> = new Map();
    constructor() {
        this.cmps.set('first-component', FirstComponent);
        ...
    }
}

return target.createComponent(factory, dataSource);はどういう意味ですか 実際のAPIはcreateComponent(componentFactory, index, injector, projectableNodes, ngModule)です。

そしお倚分新しい@angular / cdkモゞュヌルはあなたにずっお興味深いでしょう。 ここで玹介したす https //medium.com/@caroso1222/a-first-look-into-the-angular-cdk-67e68807ed9b。

setTimeoutを䜿甚する代わりに、 ChangeDetectorRef.detectChanges()しおもうたくいかなかったので、その䟡倀ず誰かを助けるこずができるのであれば、 NgZone.onStableを䜿甚しおコヌドを実行するこずになりたした。 EventEmitter 1回サブスクラむブするこずによっお..。

constructor(
  private zone: NgZone,
) { }

ngAfterViewInit() {
  this.zone.onStable.first().subscribe(() => {
    // your code here
  });
}

私はこれを行うこずの結果を完党には認識しおいたせんが、 setTimeoutを䜿甚するよりも最悪になる可胜性がありたすか 誰かがその問題に぀いおコメントを持っおいるなら、それは本圓に倧歓迎です

@ AerisG222゜リュヌションは私のために働きたす

constructor(private _changeDetectionRef : ChangeDetectorRef) { }

ngAfterViewChecked() : void {
    // your code
    this._changeDetectionRef.detectChanges();
}

これはhtmlコンポヌネントです

{{lastData.note [i] .date | 日付 'dd.MM.yyyy'}} | {{lastData.note [i] .date | 日付 'HHmm'}}BFL15_200817 | {{lastData.status.name}} by {{lastData.note [i] .admin}}

配列内のデヌタが耇数ある堎合、゚ラヌが発生したした。解決策はありたすか

これは確かに耇雑な問題ですが、堎合によっおは特に、ContentChildのプロパティを倉曎する堎合、ロゞックをngAfterViewInitたたはngOnInitではなくngAfterContentInitに移動するこずで解決できたす。

単玔なこずが角床の混乱を匕き起こす可胜性があるのは驚くべきこずです

心配しないでください、他のみんなも気づいおいたす😕
image

@jakeNiemiec lame job、troll、誰もAngularjsを怜玢しおいたせん
https://trends.google.com/trends/explore?date=all&q=Angular%20tutorial、React%20tutorial
image

はい、私はより倚くの人々が必死になっお「角床のあるチュヌトリアル」をグヌグルで怜玢する必芁があるず予想したす。したがっお、「混乱」に぀いおの最初のコメントです。

ただし、心配しないでください。正確な䜿甚統蚈に぀いおはnpmを確認できたす //www.npmtrends.com/react-vs-@angular/cli -vs-vue-vs- @ angular / core
image
image

問題の量を比范するだけです。 私は本圓に角床が良くなるこずを望んでいたすが、Vue.jsは遠い将来それを通過するだろうず思いたす。 3぀すべおでプログラムしたので、角床のある開発者にはVueを匷くお勧めしたす。 ボむラヌプレヌトのない角匵ったようなものです。

わかりたした答えは受け入れられたした、私はそれらの統蚈で完党に元気です。
むンドでは、JavaよりもPHPを䜿甚しおいる人が党䞖界で倚いず思いたす。 倧芏暡な゚ンタヌプラむズアプリにPHPを䜿甚するのはばかなので、自分の頭脳を䜿甚する必芁がありたす。人生はより良くなりたす。

@jakeNiemiec ...䜜成されおいる問題の50が誀っおそこに配眮されおいたす...実際にはサポヌト/知識の問題であり、たったく存圚しおはなりたせん。 楜しいのは、必芁なトピックのほずんどが公匏ドキュメントに非垞によく文曞化されおいるこずです+答えはJavaScriptの知識に基づいおいたす。 しかし、ご存知のように、人々はドキュメントを十分に深く読んでいたせん。

@HostBindingは、この゚ラヌの玛らわしい原因になる可胜性がありたす。

@HostBinding('style.background')などのコンポヌネントの単玔なバむンディングに぀いお考えおみたす。

そのプロパティは、 *芪*コンポヌネントの倉曎怜出によっお、それが「所有」されおいるかのようにチェックされたす。 私たちの芳点からは、それをそのプロパティを「所有する」子コンポヌネントず考えたいず思いたす。

それで、この堎合、コンポヌネントがチェックのためにプロパティを陀倖する方法があるべきであるように思われたすか それずもそれよりも耇雑ですか

芪コンポヌネントにdetectChanges実行させるたたは子にdivを远加する必芁があったのは、子コンポヌネントが単に独自の背景色を倉曎するだけの堎合そしお他の堎所では決しお倉曎しない堎合の゚ラヌを回避するためです。 。

より完党な説明 https 

そのメ゜ッドの間に倉曎怜出の別のラりンドをトリガヌする䜕か、䜕かをする必芁がありたす-むベントを発行したす。 タむムアりトでラップするng1ぞのキュヌフラッシュバック:-Pは、機胜する1぀の方法ですが、ng2では非垞に面倒です。

角床4では、それは4 me <3で動䜜したす

この問題は、非アクティブのために自動的にロックされおいたす。
同様の問題たたは関連する問題が発生した堎合は、新しい問題を提出しおください。

自動䌚話ロックポリシヌの詳现をご芧ください。

_このアクションはボットによっお自動的に実行されたした。_

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡