যখন কোনও উপাদান সম্পত্তি বর্তমান তারিখের উপর নির্ভর করে তখন কীভাবে অ্যাঙ্গুলার 2 পরিচালনা করতে হবে "এটি পরীক্ষা করার পরে" এক্সপ্রেশনটি পরিবর্তন হয়েছে "exception


167

আমার উপাদানগুলির শৈলী রয়েছে যা বর্তমান তারিখের উপর নির্ভর করে। আমার উপাদানটিতে আমি নিম্নলিখিত ফাংশন পেয়েছি।

  private fontColor( dto : Dto ) : string {
    // date d'exécution du dto
    let dtoDate : Date = new Date( dto.LastExecution );

    (...)

    let color =  "hsl( " + hue + ", 80%, " + (maxLigness - lightnessAmp) + "%)";

    return color;
  }

lightnessAmpবর্তমান তারিখ থেকে গণনা করা হয়। dtoDateগত 24 ঘন্টার মধ্যে রঙের পরিবর্তন হয়।

সঠিক ত্রুটি নিম্নলিখিত:

এটি যাচাই করার পরে অভিব্যক্তি পরিবর্তন হয়েছে। পূর্ববর্তী মান: 'এইচএসএল (123, 80%, 49%)'। বর্তমান মান: 'এইচএসএল (123, 80%, 48%)'

আমি জানি ব্যতিক্রমটি বিকাশ মোডে প্রদর্শিত হবে কেবলমাত্র মানটি যাচাই করা হয়। যদি পরীক্ষিত মান আপডেট হওয়া মানের থেকে আলাদা হয় তবে ব্যতিক্রম নিক্ষেপ করা হয়।

সুতরাং আমি ব্যতিক্রমটি রোধ করতে নিম্নলিখিত হুক পদ্ধতিতে প্রতিটি লাইফসাইকেলে বর্তমান তারিখের সময় আপডেট করার চেষ্টা করেছি:

  ngAfterViewChecked()
  {
    console.log( "! changement de la date du composant !" );
    this.dateNow = new Date();
  }

... তবে সাফল্য ছাড়া


উত্তর:


356

পরিবর্তনের পরে স্পষ্টভাবে পরিবর্তন সনাক্তকরণ চালান:

import { ChangeDetectorRef } from '@angular/core';

constructor(private cdRef:ChangeDetectorRef) {}

ngAfterViewChecked()
{
  console.log( "! changement de la date du composant !" );
  this.dateNow = new Date();
  this.cdRef.detectChanges();
}

নিখুঁত সমাধান, আপনাকে ধন্যবাদ। আমি লক্ষ্য করেছি যে এটি নিম্নলিখিত হুক পদ্ধতির সাথেও কাজ করে: এনজিওচেনজেস, এনজিডোচেক, এনজিএফটারকন্টেন্টচেকড। সুতরাং একটি সেরা বিকল্প আছে?
অ্যান্টনি ব্রেনেলিয়ার

27
এটি আপনার ব্যবহারের ক্ষেত্রে নির্ভর করে। কোনও উপাদান সূচনা করার সময় আপনি কিছু করতে চাইলে ngOnInit()সাধারণত প্রথম স্থান হয়। কোডটি যদি ডিওএম রেন্ডার হয়ে থাকে তার উপর নির্ভর করে ngAfterViewInit()বা ngAfterContentInit()পরবর্তী বিকল্পগুলি। ngOnChanges()কোডটি প্রতিবার যদি কোনও ইনপুট পরিবর্তন করা হয় তখন কার্যকর করা উচিত a ngDoCheck()কাস্টম পরিবর্তন সনাক্তকরণের জন্য। আসলে আমি জানিনা কোনটির ngAfterViewChecked()জন্য সবচেয়ে বেশি ব্যবহৃত হয়। আমি মনে করি এটি ঠিক আগে বা পরে বলা হয়েছিল ngAfterViewInit()
গন্টার জ্যাচবাউয়ার

2
@ কুশলজয়েসওয়াল দুঃখিত, আপনার বিবরণটি বোঝাতে পারছেন না। আমি কোডটি দিয়ে একটি নতুন প্রশ্ন তৈরি করার পরামর্শ দেব যা এটি প্রমাণ করে যে আপনি কী সম্পাদন করতে চান। আদর্শভাবে স্ট্যাকব্লিটজ উদাহরণ সহ।
গন্টার জ্যাচবাউয়ার

4
আপনার উপাদান রাষ্ট্র যদি ব্রাউজার-গণনা করা DOM বৈশিষ্ট্য clientWidth, ইত্যাদির উপর ভিত্তি করে থাকে তবে এটিও একটি দুর্দান্ত সমাধান
জোনা

1
সবেমাত্র এনজিএফটারভিউআইনিট-এ ব্যবহৃত হয়েছে, একটি কবজির মতো কাজ করেছে।
ফ্রান্সিসকো আরলিও

41

টি এল; ডিআর

ngAfterViewInit() {
    setTimeout(() => {
        this.dateNow = new Date();
    });
}

যদিও এটি কার্যকর নয়, কখনও কখনও এই সমস্যাটি যে কোনও সুন্দর উপায়ে সমাধান করা সত্যিই কঠিন, তাই আপনি যদি এই পদ্ধতির ব্যবহার করছেন তবে নিজেকে দোষ দেবেন না। ঠিক আছে.

উদাহরণ : প্রাথমিক সমস্যা [ লিঙ্ক ], setTimeout()[ লিঙ্ক ] এর সাথে সমাধান করা


কিভাবে এড়াতে

সাধারণভাবে এই ত্রুটিটি আপনি কোথাও যুক্ত করার পরে ঘটে (এমনকি পিতামাতার / সন্তানের উপাদানগুলিতেও) ngAfterViewInit। তাই প্রথম প্রশ্ন নিজেকে জিজ্ঞাসা করা - আমি ছাড়া বাঁচতে পারি ngAfterViewInit? সম্ভবত আপনি কোডটি কোথাও সরিয়ে নিয়েছেন ( ngAfterViewCheckedবিকল্প হতে পারে))

উদাহরণ : [ লিঙ্ক ]


এছাড়াও

এটিতে DYM কে ngAfterViewInitপ্রভাবিত করে এমন async স্টাফের কারণ হতে পারে। পাইপের মাধ্যমে অপারেটরটির মাধ্যমে setTimeoutবা যোগ করার মাধ্যমেও সমাধান করা যেতে পারে delay(0):

ngAfterViewInit() {
  this.foo$
    .pipe(delay(0)) //"delay" here is an alternative to setTimeout()
    .subscribe();
}

উদাহরণ : [ লিঙ্ক ]


ভাল পড়া

এটি কীভাবে ডিবাগ করা যায় এবং কেন এটি হয় সে সম্পর্কে ভাল নিবন্ধ: লিঙ্ক


2
নির্বাচিত সমাধানের চেয়ে ধীর বলে মনে হচ্ছে
পিট বি

6
এটি সেরা সমাধান নয়, তবে এটি সবসময় কাজ করে। নির্বাচিত উত্তর সবসময় কাজ করে না (এটি কাজ করার জন্য
হুকটি

এটি কেন কাজ করে তার সঠিক ব্যাখ্যা কী, কেউ জানে? এটি কি কারণ এটি তখন অন্য কোনও থ্রেডে (async) চালিত হয়?
knnhcn

3
@knnhcn জাভাস্ক্রিপ্টে আলাদা আলাদা থ্রেডের মতো জিনিস নেই। জেএস প্রকৃতির দ্বারা একক থ্রেডযুক্ত। সেটটাইমআউট কেবল ইঞ্জিনটিকে টাইমারটি শেষ হওয়ার কিছুক্ষণ পরে ফাংশনটি সম্পাদন করতে বলে এখানে টাইমারটি 0, যা প্রকৃতপক্ষে আধুনিক ব্রাউজারগুলিতে 4 হিসাবে বিবেচিত হয়, যা
কৌণিকের জন্য

26

যেমনটি গিথুব ইস্যুতে @ লিওসেসিরো দ্বারা উল্লিখিত হয়েছে

যারা সহজ সমাধানের সন্ধান করছেন তাদের জন্য আমি 3 টি সমাধান পেয়েছি।

1) থেকে মুভিং ngAfterViewInitকরতেngAfterContentInit

2) # 14748 (মন্তব্য) এর পরামর্শ অনুসারে ngAfterViewCheckedএকত্রিত হয়ে ChangeDetectorRefচলেছেন

3) এনজিওইনিট () দিয়ে রাখুন তবে ChangeDetectorRef.detectChanges()আপনার পরিবর্তনগুলির পরে কল করুন।


1
সর্বাধিক প্রস্তাবিত সমাধানটি কী ডকুমেন্ট করতে পারেন?
পিপো

13

তার আপনি দুটি সমাধান যেতে!

1. পরিবর্তন ChangeDetectionStrategy OnPush করতে

এই সমাধানের জন্য, আপনি মূলত কৌনিকটি বলছেন:

পরিবর্তনগুলি পরীক্ষা করা বন্ধ করুন; আমি কেবল তখনই করবো যখন আমার জানা দরকার

দ্রুত সমাধান:

আপনার উপাদানটি পরিবর্তন করুন যাতে এটি ব্যবহার করবে ChangeDetectionStrategy.OnPush

@Component({
  selector: 'app-child',
  templateUrl: './child.component.html',
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class ChildComponent implements OnInit {
    // ...
}

এটি দিয়ে জিনিসগুলি আর কাজ করবে বলে মনে হয় না। এর কারণ এখন থেকে আপনাকে detectChanges()ম্যানুয়ালি অ্যাংুলার কল করতে হবে ।

this.cdr.detectChanges();

এখানে এমন একটি লিঙ্ক রয়েছে যা আমাকে চেঞ্জডিটেকশনস্ট্রেজি সঠিকভাবে বুঝতে সহায়তা করেছে : https://alligator.io/angular/change-detection-strategy/

2. এক্সপ্রেশন চ্যাঞ্জডএফটারআইটি হাসবিন চেকডএরর বোঝা

এই ত্রুটির কারণ সম্পর্কে টোমোনারি_ট উত্তর থেকে এখানে একটি ছোট্ট নির্যাস এখানে দেওয়া হয়েছে , আমি কেবলমাত্র সেই অংশগুলি অন্তর্ভুক্ত করার চেষ্টা করেছি যা এটি বুঝতে সাহায্য করেছিল।

সম্পূর্ণ নিবন্ধটি এখানে প্রদর্শিত প্রতিটি পয়েন্ট সম্পর্কে বাস্তব কোড উদাহরণগুলি দেখায়।

মূল কারণটি কৌণিক জীবনচক্রের:

প্রতিটি ক্রিয়াকলাপের পরে কৌণিক মনে করে যে এটি কোনও অপারেশন করতে ব্যবহৃত মানগুলি values এগুলি উপাদান ভিউয়ের পুরাতনভ্যালুতে সম্পত্তিতে সংরক্ষিত আছে।

কৌনিকটি সমস্ত উপাদানগুলির জন্য সম্পন্ন হওয়ার পরে পরবর্তী ডাইজেস্ট চক্র শুরু হয় তবে অপারেশন সম্পাদনের পরিবর্তে এটি বর্তমান মানগুলিকে তুলনামূলকভাবে পূর্ববর্তী ডাইজেস্ট চক্রের সাথে স্মরণ করে ares

নিম্নলিখিত ক্রিয়াকলাপগুলি ডাইজেস্ট চক্রের পরীক্ষা করা হচ্ছে:

চেক করুন যে সন্তানের উপাদানগুলিতে নিচে দেওয়া মানগুলি সেই মানগুলির সাথে সমান হয় যা এই উপাদানগুলির বৈশিষ্ট্যগুলি এখন আপডেট করতে ব্যবহৃত হবে।

পরীক্ষা করুন যে ডিওএম উপাদানগুলি আপডেট করতে ব্যবহৃত মানগুলি একই উপাদানগুলির আপডেট করার জন্য ব্যবহৃত মানগুলির সাথে একই হয় এখন এটি একই সম্পাদন করে।

সমস্ত সন্তানের উপাদানগুলির জন্য চেক

এবং সুতরাং, তুলনা করা মানগুলি পৃথক হলে ত্রুটি নিক্ষেপ করা হয়। , ব্লগার ম্যাক্স কোরেটস্কিই বলেছেন:

অপরাধী সর্বদা শিশু উপাদান বা নির্দেশিকা।

এবং অবশেষে এখানে কিছু বাস্তব বিশ্বের নমুনা রয়েছে যা সাধারণত এই ত্রুটি ঘটায়:

  • সেবা ভাগ
  • সিঙ্ক্রোনাস ইভেন্ট সম্প্রচার
  • গতিশীল উপাদান তাত্ক্ষণিক

প্রতিটি নমুনা এখানে পাওয়া যাবে (plunkr), আমার ক্ষেত্রে সমস্যাটি ছিল একটি গতিশীল উপাদান তাত্ক্ষণিক।

এছাড়াও, আমার নিজের অভিজ্ঞতার দ্বারা আমি দৃ avoid়ভাবে সবাইকে setTimeoutসমাধানটি এড়াতে পরামর্শ দিই , আমার ক্ষেত্রে "প্রায়" অসীম লুপ সৃষ্টি হয়েছে (21 টি কল যা আমি আপনাকে কীভাবে উস্কে দিতে পারি তা দেখাতে রাজি নই),

আমি সর্বদা কৌণিক জীবনচক্রের বিষয়টি মাথায় রাখার পরামর্শ দিচ্ছি যাতে আপনি যখন অন্য কোনও উপাদানটির মান পরিবর্তন করেন প্রতিবার তারা কীভাবে প্রভাবিত হবে সে বিষয়টি আপনি বিবেচনায় নিতে পারেন। এই ত্রুটির সাথে কৌণিক আপনাকে বলছে:

আপনি সম্ভবত এটি ভুল উপায়ে করছেন, আপনি কি ঠিক আছেন বলে নিশ্চিত?

একই ব্লগ আরও বলে:

প্রায়শই, স্থির পরিবর্তনটি ডায়নামিক উপাদান তৈরি করতে সঠিক পরিবর্তন সনাক্তকরণ হুক ব্যবহার করা হয়

আমার জন্য একটি সংক্ষিপ্ত গাইড কোডিং করার সময় নিম্নলিখিত দুটি বিষয় বিবেচনা করা ( আমি সময়ের সাথে সাথে এটি পরিপূরক করার চেষ্টা করব ):

  1. পরিবর্তে এটির সন্তানের উপাদানগুলি থেকে পিতামাতার উপাদানগুলির মানগুলি পরিবর্তন করা থেকে বিরত থাকুন: এটিকে তার পিতামাতার থেকে সংশোধন করুন।
  2. আপনি যখন ব্যবহার করেন @Inputএবং @Outputনির্দেশাবলী উপাদানটি সম্পূর্ণরূপে শুরু না করা হয় ততক্ষণ লাইফাইসাইকেলের পরিবর্তনগুলি ট্রিগার করা এড়ানোর চেষ্টা করবেন।
  3. এগুলির অপ্রয়োজনীয় কলগুলি this.cdr.detectChanges();এড়াতে আরও ত্রুটিগুলি ট্রিগার করতে পারে, বিশেষত যখন আপনি প্রচুর গতিশীল ডেটার সাথে ডিল করেন
  4. যখন ব্যবহার this.cdr.detectChanges();বাধ্যতামূলক হয় তা নিশ্চিত করুন যে @Input, @Output, etcব্যবহার করা ভেরিয়েবলগুলি ( ) সঠিক সনাক্তকরণ হুক ( OnInit, OnChanges, AfterView, etc) এ পূরণ করা / আরম্ভ করা হয়েছে
  5. যখন সম্ভব হয়, লুকানোর পরিবর্তে সরান , এটি 3 এবং 4 পয়েন্টের সাথে সম্পর্কিত।

এছাড়াও

আপনি যদি অ্যাংুলার লাইফ হুক পুরোপুরি বুঝতে চান তবে আমি আপনাকে অফিশিয়াল ডকুমেন্টেশনটি এখানে পড়ার পরামর্শ দিচ্ছি:


আমি এখনও বুঝে উঠতে পারে না কেন পরিবর্তন ChangeDetectionStrategyকরতে OnPushআমার জন্য নির্ধারিত করুন। আমার একটি সরল উপাদান রয়েছে, যা রয়েছে [disabled]="isLastPage()"। এই পদ্ধতিটি MatPaginator-ভিউচিল্ডটি পড়ছে এবং ফিরে আসছে this.paginator !== undefined ? this.paginator.pageIndex === this.paginator.getNumberOfPages() - 1 : true;। প্যাগেইনেটর এখনই উপলভ্য নয়, তবে এটি ব্যবহারে আবদ্ধ হওয়ার পরে @ViewChildChangeDetectionStrategyমুছে ফেলা ত্রুটিটি পরিবর্তন করা - এবং কার্যকারিতা এখনও ঠিক আগের মতোই বিদ্যমান। আমার এখন কোন অসুবিধা আছে তা নিশ্চিত নন, তবে আপনাকে ধন্যবাদ!
ইগর

এটি দুর্দান্ত @ ইগর! ব্যবহারের একমাত্র প্রত্যাহার OnPushহ'ল আপনি যে this.cdr.detectChanges()উপাদানটি রিফ্রেশ করতে চান তা প্রতিবার ব্যবহার করতে হবে । আমার ধারণা আপনি ইতিমধ্যে এটি ব্যবহার করেছেন
লুইস লিমাস

9

আমাদের ক্ষেত্রে আমরা উপাদান হিসাবে পরিবর্তন অনুসন্ধান যোগ করে এবং এনজিএফটারকন্টেন্টচেকডে কোড ডিটেক্ট চেঞ্জস () কল করে নীচে স্থির করেছি

@Component({
  selector: 'app-spinner',
  templateUrl: './spinner.component.html',
  styleUrls: ['./spinner.component.scss'],
  changeDetection: ChangeDetectionStrategy.OnPush
})
export class SpinnerComponent implements OnInit, OnDestroy, AfterContentChecked {

  show = false;

  private subscription: Subscription;

  constructor(private spinnerService: SpinnerService, private changeDedectionRef: ChangeDetectorRef) { }

  ngOnInit() {
    this.subscription = this.spinnerService.spinnerState
      .subscribe((state: SpinnerState) => {
        this.show = state.show;
      });
  }

  ngAfterContentChecked(): void {
      this.changeDedectionRef.detectChanges();
  }

  ngOnDestroy() {
    this.subscription.unsubscribe();
  }

}

2

আমি মনে করি আপনি যে সর্বোত্তম এবং পরিষ্কার সমাধানটি কল্পনা করতে পারেন তা হ'ল:

@Component( {
  selector: 'app-my-component',
  template: `<p>{{ myData?.anyfield }}</p>`,
  styles: [ '' ]
} )
export class MyComponent implements OnInit {
  private myData;

  constructor( private myService: MyService ) { }

  ngOnInit( ) {
    /* 
      async .. await 
      clears the ExpressionChangedAfterItHasBeenCheckedError exception.
    */
    this.myService.myObservable.subscribe(
      async (data) => { this.myData = await data }
    );
  }
}

কৌণিক 5.2.9 দিয়ে পরীক্ষিত


3
এটি হ্যাকি .. এবং তাই অনন্যসাধারণ।
জোয়ারি শোবি

1
@ জোরিশিবি উপরের অন্যান্য সমস্ত সমাধান হ'ল সেটটাইমআউটস বা অ্যাডভান্সড অ্যাংুলার ইভেন্টের উপর ভিত্তি করে ওয়ার্কআরাউন্ডস ... এই সমাধানটি খাঁটি ES2017 যা সমস্ত মেজর ব্রাউজারগুলি বিকাশকারী.মোজিলা.আর.ইন.ইউ / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট /
জাভিয়েরফুয়েন্টস

1
আপনি উদাহরণস্বরূপ অ্যাঙ্গুলার + কর্ডোভা ব্যবহার করে কোনও মোবাইল অ্যাপ্লিকেশন (অ্যান্ড্রয়েড এপিআই 17 টি টার্গেট করে) তৈরি করছেন তবে আপনি যেখানে ES2017 বৈশিষ্ট্যগুলি নির্ভর করতে পারবেন না? মনে রাখবেন গৃহীত উত্তরটি একটি সমাধান, কোনও
কর্মচিকিত্সা নয়

@ জোরিশিবি টাইপস্ক্রিপ্ট ব্যবহার করে এটি জেএস-তে সংকলিত হয়েছে, তাই কোনও বৈশিষ্ট্য সমর্থন সংক্রান্ত সমস্যা নেই।
বিগগবেস্ট

@ বিগগবেস্ট এর সাথে আপনার কী অর্থ? আমি জানি টাইপস্ক্রিপ্টটি জেএসে সংকলিত হবে, তবে এটি আপনাকে সমস্ত জেএস কাজ করবে বলে ধরে নিতে সক্ষম করে না। নোট করুন যে জাভাস্ক্রিপ্ট ওয়েব ব্রাউজারে চালিত হয়েছে এবং প্রতিটি ব্রাউজার এতে আলাদা আচরণ করে।
জোয়ারি শোয়েবি

2

আমার চারপাশে একটি ছোট কাজ বহুবার ব্যবহৃত হয়েছিল

Promise.resolve(null).then(() => {
    console.log( "! changement de la date du composant !" );
    this.dateNow = new Date();
    this.cdRef.detectChanges();
});

আমি নিয়ামক হিসাবে আমি ব্যবহার করি কিছু পরিবর্তনশীল সঙ্গে "নাল" প্রতিস্থাপন।


1

যদিও ইতিমধ্যে অনেক উত্তর রয়েছে এবং পরিবর্তন সনাক্তকরণ সম্পর্কিত খুব ভাল নিবন্ধের লিঙ্ক, আমি আমার দুটি সেন্ট এখানে দিতে চেয়েছিলাম। আমি মনে করি চেকটি কোনও কারণে রয়েছে তাই আমি আমার অ্যাপ্লিকেশনটির আর্কিটেকচার সম্পর্কে চিন্তাভাবনা করেছি এবং বুঝতে পেরেছি যে দৃশ্যের পরিবর্তনগুলি ব্যবহার করে BehaviourSubjectএবং সঠিক লাইফেসাইকেল হুক ব্যবহার করে মোকাবেলা করা যেতে পারে । সমাধানের জন্য আমি যা করেছি তা এখানে।

  • আমি একটি তৃতীয় পক্ষের উপাদান ( ফুলক্যালেন্ডার) ব্যবহার করি, তবে আমি কৌণিক উপাদানও ব্যবহার করি , তাই যদিও স্টাইলিংয়ের জন্য আমি একটি নতুন প্লাগইন তৈরি করেছি, চেহারা এবং অনুভূতিটি কিছুটা বিশ্রী হয়েছে কারণ ক্যালেন্ডার শিরোনামের কাস্টমাইজেশন রেপো কাঁটাচামক ছাড়া সম্ভব নয় is এবং আপনার নিজের ঘূর্ণায়মান।
  • সুতরাং আমি অন্তর্নিহিত জাভাস্ক্রিপ্ট ক্লাস পেয়ে শেষ করেছি, এবং উপাদানটির জন্য আমার নিজস্ব ক্যালেন্ডার শিরোনাম শুরু করতে হবে। এর জন্য ViewChildআমার পিতামাতার রেন্ডার হওয়ার জন্য রেন্ডার করা দরকার, যা কৌণিক কাজ করে না। এই কারণেই আমি আমার টেমপ্লেটের জন্য আমার প্রয়োজনীয় মূল্যটি একটিতে গুটিয়ে রেখেছি BehaviourSubject<View>(null):

    calendarView$ = new BehaviorSubject<View>(null);

এরপরে, যখন আমি নিশ্চিত হতে পারি যে ভিউটি চেক করা হয়েছে, আমি সেই বিষয়টি এর থেকে মূল্যটি আপডেট করে @ViewChild:

  ngAfterViewInit(): void {
    // ViewChild is available here, so get the JS API
    this.calendarApi = this.calendar.getApi();
  }

  ngAfterViewChecked(): void {
    // The view has been checked and I know that the View object from
    // fullcalendar is available, so emit it.
    this.calendarView$.next(this.calendarApi.view);
  }

তারপরে, আমার টেমপ্লেটে, আমি কেবল asyncপাইপটি ব্যবহার করি । পরিবর্তন সনাক্তকরণ সহ কোনও হ্যাকিং নেই, কোনও ত্রুটি নেই, সহজেই কাজ করে।

আপনার আরও বিশদ প্রয়োজন কিনা জিজ্ঞাসা করতে দ্বিধা করবেন না।


1

ত্রুটি এড়াতে একটি ডিফল্ট ফর্ম মান ব্যবহার করুন।

এনজিএফটারভিউআইনিট () যা (আমার ক্ষেত্রে ত্রুটিটিও সমাধান করেছে) তে ডিটেনচেনজেস () প্রয়োগের স্বীকৃত উত্তরটি ব্যবহার না করে পরিবর্তে স্থিরভাবে প্রয়োজনীয় ফর্ম ক্ষেত্রের জন্য একটি ডিফল্ট মান সংরক্ষণ করার সিদ্ধান্ত নিয়েছিলাম, যাতে ফর্মটি পরে আপডেট হওয়ার পরে, ব্যবহারকারী যদি ফর্মটিতে এমন কোনও বিকল্প পরিবর্তন করার সিদ্ধান্ত নেয় যা নতুন প্রয়োজনীয় ক্ষেত্রগুলিকে ট্রিগার করবে (এবং জমা দেওয়ার বোতামটি অক্ষম করে দেবে) তবে এর বৈধতা পরিবর্তন করা হবে না।

এটি আমার উপাদানটিতে একটি সামান্য বিট কোড সংরক্ষণ করেছিল এবং আমার ক্ষেত্রে ত্রুটি পুরোপুরি এড়ানো হয়েছিল।


এটি একটি সত্যিই ভাল অভ্যাস, এই নিয়ে তোমার কাছে একটি অপ্রয়োজনীয় কল এড়াতেthis.cdr.detectChanges()
লুইস Limas

1

আমি সেই ত্রুটিটি পেয়েছি কারণ আমি একটি পরিবর্তনশীল ঘোষণা করেছি এবং পরে
এটির ব্যবহার করে এর মান পরিবর্তন করতে চেয়েছিলামngAfterViewInit

export class SomeComponent {

    header: string;

}

আমি যে পরিবর্তন করেছি তা ঠিক করতে fix

ngAfterViewInit() { 

    // change variable value here...
}

প্রতি

ngAfterContentInit() {

    // change variable value here...
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.