কৌনিক 2 তে কোনও উপাদানটির পুনরায় রেন্ডারিংকে কীভাবে বাধ্য করা যায়? ডিবাগ উদ্দেশ্যে Redux এর সাথে কাজ করার জন্য আমি কোনও উপাদানটিকে তার দর্শনটিকে পুনরায় রেন্ডার করতে বাধ্য করতে চাই, এটি কি সম্ভব?
কৌনিক 2 তে কোনও উপাদানটির পুনরায় রেন্ডারিংকে কীভাবে বাধ্য করা যায়? ডিবাগ উদ্দেশ্যে Redux এর সাথে কাজ করার জন্য আমি কোনও উপাদানটিকে তার দর্শনটিকে পুনরায় রেন্ডার করতে বাধ্য করতে চাই, এটি কি সম্ভব?
উত্তর:
পরিবর্তন সনাক্তকরণের পরে রেন্ডারিং হয়। পরিবর্তন সনাক্তকরণকে বাধ্য করার জন্য, যাতে পরিবর্তিত পরিবর্তিত উপাদান উপাদানগুলি ডিওমে প্রচারিত হয় (এবং তারপরে ব্রাউজারটি সেই পরিবর্তনগুলিতে এই পরিবর্তনগুলি রেন্ডার করবে), এখানে কিছু বিকল্প রয়েছে:
$rootScope.$digest()
- যেমন, সম্পূর্ণ উপাদান গাছটি পরীক্ষা করুন$rootScope.$apply(callback)
- যেমন, কৌণিক 2 জোনের অভ্যন্তরে কলব্যাক ফাংশনটি মূল্যায়ন করুন। আমি মনে করি, তবে আমি নিশ্চিত নই, এটি কলব্যাক ফাংশনটি সম্পাদন করার পরে সম্পূর্ণ উপাদান গাছ পরীক্ষা করে শেষ করবে।$scope.$digest()
- যেমন কেবল কেবল এই উপাদান এবং এর শিশুদের পরীক্ষা করুনআপনার দ্বারা আমদানি করা এবং তারপর উদ্বুদ্ধ করতে হবে ApplicationRef
, NgZone
অথবা ChangeDetectorRef
আপনার উপাদান মধ্যে।
আপনার নির্দিষ্ট দৃশ্যের জন্য, আমি কেবলমাত্র একটি একক উপাদান পরিবর্তিত হলে আমি শেষ বিকল্পটি সুপারিশ করব।
this is the first time I am facing an update not working in ng2
। পরিবর্তন সনাক্তকরণ কৌশলটি ডিফল্ট তাই আমি জানি যে আমি পরিবর্তন সনাক্তকরণ কৌশলটি নিয়ে গণ্ডগোল করিনি।
this
পোস্টের কলব্যাকে সঠিক প্রসঙ্গটি ব্যবহার করা নয় ।
pure:false
পাইপ দিয়ে চেষ্টাও করেছি । এটি কাজ করে তবে এটি আমার ব্যবহারের ক্ষেত্রে ব্যয়বহুল (অদক্ষ)।
tx, আমার প্রয়োজন মতো কাজের সন্ধান পেয়েছিল:
constructor(private zone:NgZone) {
// enable to for time travel
this.appStore.subscribe((state) => {
this.zone.run(() => {
console.log('enabled time travel');
});
});
চলমান জোন.আরুন উপাদানটিকে পুনরায় রেন্ডার করতে বাধ্য করবে
পরিবর্তনডেক্টরআরফ পদ্ধতির
import { Component, OnInit, ChangeDetectorRef } from '@angular/core';
export class MyComponent {
constructor(private cdr: ChangeDetectorRef) { }
selected(item: any) {
if (item == 'Department')
this.isDepartment = true;
else
this.isDepartment = false;
this.cdr.detectChanges();
}
}
আমি * এনজিআইএফ ব্যবহার করে আমার উপাদান পুনরায় লোড করি।
আমার ধারকটির অভ্যন্তরের সমস্ত উপাদানগুলি পুরো জীবনচক্রের হুকগুলিতে ফিরে যায়।
টেমপ্লেটে:
<ng-container *ngIf="_reload">
components here
</ng-container>
তারপরে ts ফাইলে:
public _reload = true;
private reload() {
setTimeout(() => this._reload = false);
setTimeout(() => this._reload = true);
}
setTimeout()
। এখন খনি একটি সহজ এবং লাইটওয়েট সমাধান সঙ্গে কাজ করছে!
এখানে অন্যান্য উত্তরগুলি পরিবর্তন সনাক্তকরণ চক্রগুলি ট্রিগার করার জন্য সমাধান সরবরাহ করে যা উপাদানগুলির ভিউ আপডেট করে (যা সম্পূর্ণ পুনরায় রেন্ডার হিসাবে একই নয়)।
ফুল পুনরায় রেন্ডার, যা ধ্বংস reinitialize উপাদান (সমস্ত জীবনচক্র আঙ্গুলসমূহ কলিং এবং পুনর্নির্মাণ দৃশ্য) হবে ব্যবহার করে কাজ করা যেতে পারে ng-template
, ng-container
এবং ViewContainerRef
নিম্নলিখিত পদ্ধতিতে:
<div>
<ng-container #outlet >
</ng-container>
</div>
<ng-template #content>
<child></child>
</ng-template>
তারপরে উভয়ের সাথে উল্লেখ থাকা উপাদানগুলিতে #outlet
এবং #content
আমরা আউটলেটগুলির বিষয়বস্তু সাফ করতে পারি এবং শিশু উপাদানটির অন্য একটি উদাহরণ সন্নিবেশ করতে পারি:
@ViewChild("outlet", {read: ViewContainerRef}) outletRef: ViewContainerRef;
@ViewChild("content", {read: TemplateRef}) contentRef: TemplateRef<any>;
private rerender() {
this.outletRef.clear();
this.outletRef.createEmbeddedView(this.contentRef);
}
অতিরিক্তভাবে প্রাথমিক সামগ্রী AfterContentInit
হুকটিতে প্রবেশ করানো উচিত :
ngAfterContentInit() {
this.outletRef.createEmbeddedView(this.contentRef);
}
সম্পূর্ণ কার্যক্ষম সমাধানটি এখানে https://stackblitz.com/edit/angular-component-reender পাওয়া যাবে ।
ChangeDetectorRef.detectChanges()
এটি হ'ল এটি করার সবচেয়ে কেন্দ্রিক উপায়। ApplicationRef.tick()
সাধারণত একটি স্লেজহ্যামার পদ্ধতির খুব বেশি।
ব্যবহার করতে ChangeDetectorRef.detectChanges()
, আপনার উপাদানগুলির শীর্ষে আপনার এটির প্রয়োজন হবে:
import { ChangeDetectorRef } from '@angular/core';
... তারপরে, সাধারণত আপনি আপনার উপন্যাসটি যখন আপনার কনস্ট্রাক্টরে ইনজেক্ট করেন তখন:
constructor( private cdr: ChangeDetectorRef ) { ... }
তারপরে, উপযুক্ত জায়গায় , আপনি এটিকে এটি কল করুন:
this.cdr.detectChanges();
আপনি যেখানে কল করবেন ChangeDetectorRef.detectChanges()
তা তাত্পর্যপূর্ণ হতে পারে। আপনাকে জীবনচক্রটি এবং আপনার অ্যাপ্লিকেশনটি কীভাবে কার্যকর হচ্ছে এবং এর উপাদানগুলি রেন্ডার করছে তা পুরোপুরি বুঝতে হবে। আপনার বাড়ির কাজ পুরোপুরি করার এবং ভিতরে কৌণিক জীবনচক্রটি আপনি বুঝতে পেরেছেন তা নিশ্চিত করার জন্য এখানে বিকল্প নেই। তারপরে, একবার আপনি এটি বুঝতে ChangeDetectorRef.detectChanges()
পারলে , আপনি যথাযথভাবে ব্যবহার করতে পারেন (কখনও কখনও এটি কোথায় ব্যবহার করা উচিত তা বোঝা খুব সহজ other অন্যান্য সময় এটি খুব জটিল হতে পারে)।