วิธีการบังคับให้มีการเรนเดอร์องค์ประกอบใหม่ใน Angular 2 สำหรับจุดประสงค์ในการแก้ปัญหาการทำงานกับ Redux ฉันต้องการบังคับให้องค์ประกอบแสดงภาพอีกครั้งเป็นไปได้หรือไม่
วิธีการบังคับให้มีการเรนเดอร์องค์ประกอบใหม่ใน Angular 2 สำหรับจุดประสงค์ในการแก้ปัญหาการทำงานกับ Redux ฉันต้องการบังคับให้องค์ประกอบแสดงภาพอีกครั้งเป็นไปได้หรือไม่
คำตอบ:
การแสดงผลเกิดขึ้นหลังจากการตรวจจับการเปลี่ยนแปลง ในการบังคับให้ตรวจจับการเปลี่ยนแปลงดังนั้นค่าคุณสมบัติของส่วนประกอบที่มีการเปลี่ยนแปลงจะถูกแพร่กระจายไปยัง DOM (จากนั้นเบราว์เซอร์จะแสดงการเปลี่ยนแปลงเหล่านั้นในมุมมอง) นี่คือตัวเลือกบางส่วน:
$rootScope.$digest()
- เช่นตรวจสอบโครงสร้างส่วนประกอบแบบเต็ม$rootScope.$apply(callback)
- คือประเมินฟังก์ชันการโทรกลับภายในโซน Angular 2 ฉันคิดว่า แต่ฉันไม่แน่ใจว่าสิ่งนี้จบลงที่การตรวจสอบโครงสร้างส่วนประกอบแบบเต็มหลังจากดำเนินการฟังก์ชันการเรียกกลับ$scope.$digest()
- เช่นให้ตรวจสอบเฉพาะส่วนนี้และลูก ๆ ของมันคุณจะต้องนำเข้าแล้วฉีดApplicationRef
, NgZone
หรือChangeDetectorRef
เข้าองค์ประกอบของคุณ
สำหรับสถานการณ์เฉพาะของคุณฉันขอแนะนำตัวเลือกสุดท้ายหากมีการเปลี่ยนแปลงองค์ประกอบเดียวเท่านั้น
this is the first time I am facing an update not working in ng2
ค่อนข้างแปลกที่ กลยุทธ์การตรวจจับการเปลี่ยนแปลงเป็นค่าเริ่มต้นดังนั้นฉันรู้ว่าฉันไม่ได้ยุ่งกับกลยุทธ์การตรวจจับการเปลี่ยนแปลง
this
บริบทที่เหมาะสมในการโทรกลับ POST
pure:false
ในไพพ์แล้ว มันใช้งานได้ แต่มันแพงเกินไป (ไม่มีประสิทธิภาพ) สำหรับกรณีการใช้งานของฉัน
tx พบวิธีแก้ปัญหาที่ฉันต้องการ:
constructor(private zone:NgZone) {
// enable to for time travel
this.appStore.subscribe((state) => {
this.zone.run(() => {
console.log('enabled time travel');
});
});
running zone.run จะบังคับให้องค์ประกอบแสดงผลอีกครั้ง
วิธีการของ ChangeDetectorRef
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();
}
}
ฉันบังคับให้โหลดองค์ประกอบของฉันอีกครั้งโดยใช้ * ngIf
ส่วนประกอบทั้งหมดภายในคอนเทนเนอร์ของฉันกลับไปที่ hooks lifecycle แบบเต็ม
ในเทมเพลต:
<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
hook:
ngAfterContentInit() {
this.outletRef.createEmbeddedView(this.contentRef);
}
วิธีการแก้ปัญหาการทำงานเต็มรูปแบบที่สามารถพบได้ที่นี่https://stackblitz.com/edit/angular-component-rerender
ChangeDetectorRef.detectChanges()
มักจะเป็นวิธีที่เน้นมากที่สุดในการทำเช่นนี้ ApplicationRef.tick()
มักเป็นวิธีการค้อนขนาดใหญ่เกินไป
ในการใช้งานChangeDetectorRef.detectChanges()
คุณจะต้องใช้สิ่งนี้ที่ส่วนบนของส่วนประกอบ:
import { ChangeDetectorRef } from '@angular/core';
... จากนั้นคุณมักจะอ้างว่าเมื่อคุณฉีดเข้าไปในคอนสตรัคเตอร์ของคุณเช่นนี้:
constructor( private cdr: ChangeDetectorRef ) { ... }
จากนั้นในสถานที่ที่เหมาะสมคุณเรียกมันว่า:
this.cdr.detectChanges();
ตำแหน่งที่คุณโทรChangeDetectorRef.detectChanges()
มีความสำคัญสูง คุณต้องเข้าใจวงจรชีวิตอย่างสมบูรณ์และวิธีการที่แอปพลิเคชันของคุณทำงานและแสดงองค์ประกอบของมัน ไม่มีสิ่งใดทดแทนการทำการบ้านของคุณได้อย่างสมบูรณ์และให้แน่ใจว่าคุณเข้าใจวงจรชีวิตของ Angular จากนั้นเมื่อคุณเข้าใจว่าคุณสามารถใช้งานได้ChangeDetectorRef.detectChanges()
อย่างเหมาะสม (บางครั้งมันง่ายที่จะเข้าใจว่าคุณควรใช้ที่ใดเวลาอื่นก็ซับซ้อนมาก)