ค้นหาเว็บไซต์

typescript - Angular: ตัวแปรสมาชิกไม่กำหนดค่าในฟังก์ชัน


ฉันมีบริการดังต่อไปนี้ ซึ่งมีฟังก์ชันที่ส่งค่ากลับเป็น Observable เนื่องจากมันดึงข้อมูลจากบริการอื่น แปลงข้อมูลนั้น และจากนั้นส่งค่ากลับ (เป็น Observable)

@Injectable({
  providedIn: 'root'
})
export class ReportColumnHeaderService {

  constructor(private companyService: CompanyService) {}

  public getColumnHeaderElements(variableDimensions: string[]): Observable<HeaderElement[]> {

    return Observable.create(function(observer) {

      this.companyService.getCompanies( (companies: Company[]) => {
        let headerElements = getHeaderElements(companies);
        observer.next(headerElements);
        observer.complete();
      });

    });

  }
}

ปัญหาคือ this.companyService เป็น undefined ภายใน function ผมอ่านมาว่ามันน่าจะเป็นไปได้ถ้าผมใช้ => แบบนั้น:

return Observable.create((observer)  => {

   this.companyService.getCompanies( (companies: Company[]) => {
   let headerElements = let headerElements = getHeaderElements(companies);
   observer.next(headerElements);
   observer.complete();
  });

});

แต่โค้ดนั้นคอมไพล์ไม่ได้ มันบอกว่า คาดหวัง 0 อาร์กิวเมนต์ แต่ได้ 1 อาร์กิวเมนต์ ใครสักคนช่วยให้คำใบ้วิธีแก้ปัญหานี้ได้ไหม?

คำตอบ #1

สมมติว่า getCompanies คืนค่า observable คุณกำลังพลาด subscribe ในฟังก์ชัน คำสั่งที่ถูกต้องมีดังนี้:

this.companyService.getCompanies().subscribe( (companies: Company[]) => {

คำตอบ #2

  this.companyService.getCompanies( (companies: Company[]) => {
        let headerElements = getHeaderElements(companies);
        observer.next(headerElements);
        observer.complete();
      });

ถ้าคุณต้องการดึงข้อมูลจากบริการ คุณจำเป็นต้องใช้ subscribe วิธีที่ดีที่สุดคือสร้างค่าคงที่ของคุณในเมธอดหรือเป็นตัวแปรสาธารณะ ตัวอย่างเช่น

companies: Company[];


this.companyService.getCompanies.subscribe((res) => {
                this.companies = res;
                console.log(this.compmanies)
                /** this is just simple exemple */            
              });

การสมัครรับข้อมูล Observables จำไว้ว่า observables มีลักษณะขี้เกียจ ถ้าคุณไม่สมัครรับข้อมูล จะไม่มีอะไรเกิดขึ้น การรู้ว่าเมื่อคุณสมัครรับข้อมูลกับ observer การเรียกใช้ subscribe() แต่ละครั้งจะกระตุ้นการทำงานอิสระของตัวมันเองสำหรับ observer นั้นๆ เป็นเรื่องที่ดี การเรียก subscribe จะไม่ถูกแชร์ระหว่างผู้สมัครหลายคนสำหรับ observable เดียวกัน https://medium.com/@luukgruijs/understanding-creating-and-subscribing-to-observables-in-angular-426dbf0b04a3

และแน่นอนว่าถ้าคุณสร้างการสมัครสมาชิก อย่าลืมยกเลิกการสมัครสมาชิก