如何访问接口打字稿中的属性

发布于 2025-01-14 11:32:20 字数 865 浏览 3 评论 0原文

您好,我想从可观察的接口内访问属性。

我在这个界面中有两个属性。 loan-grade.ts

export interface LoanGrade{
    grade:string
    subgrade: string
}

我使用 subscribe 来访问 Observable。 edit.component.ts

grades: LoanGrade[];
ngOnInit():void{
    this.termGradeServie.termGradeData$.subscribe(grades=>{
     this.grades = grades; 
  })
}

然后在我的 html 中我想打印出我得到的可观察到的所有成绩。但我不能做 item.grade。我该怎么做? edit.component.html

<ng-container *ngFor="let item of grades">
   <tr>
       <td><span>{{item.grade}}</span></td> 
   </tr>
</ng-container>

我认为问题是,当我订阅 termGradeData$ 时,它返回 observable(LoanGrade[]) 所以我无法帮助自己将 this.grades 设置为 LoanGrade[]。但如果我将其设置为 LoanGrade[],我将无法访问坡度或路基的属性。

Hi I want to access the property inside the interface from observable.

I have two properties inside this interface.
loan-grade.ts

export interface LoanGrade{
    grade:string
    subgrade: string
}

I use subscribe to access Observable<LoanGrade[]>.
edit.component.ts

grades: LoanGrade[];
ngOnInit():void{
    this.termGradeServie.termGradeData$.subscribe(grades=>{
     this.grades = grades; 
  })
}

Then in my html I want to print out all the grades that exist from observable I got. But I cannot do item.grade. How can I do this?
edit.component.html

<ng-container *ngFor="let item of grades">
   <tr>
       <td><span>{{item.grade}}</span></td> 
   </tr>
</ng-container>

I think the problem is that when I subscribe termGradeData$ it returns observable(LoanGrade[]) so I can't help myself to set this.grades as LoanGrade[]. But if I set it to LoanGrade[], I cannot access the property of grade or subgrade.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

烟沫凡尘 2025-01-21 11:32:20

在您的服务中,请确保使用 LoanGrade[] 类型编写可观察对象:

export interface LoanGrade {
    grade: string;
    subgrade: string;
}

@Injectable({ providedIn: 'root' })
export class TermGradeService {
    public termGradeData$: Observable<LoanGrade[]>;
}

并且在代码中的某个位置它会获取一个值(例如,通过将其连接到 http.get方法)。

如果您需要自己为其设置一个值,您可以使用“BehaviorSubject”,如下所示:

export interface LoanGrade {
    grade: string;
    subgrade: string;
}

const initalLoanGradesValue: LoanGrade[] = [];

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

    private _termGradeData$: BehaviorSubject<LoanGrade[]> = new BehaviorSubject<LoanGrade[]>(initalLoanGradesValue);

    get termGradeData$() {
        return this._termGradeData$.asObservable();
    }

    // ...
}

然后在代码中的某个位置,确保通过BehaviorSubject发出一个值:

this._termGradeData$.next([
    { grade: 'x1', subgrade: 'y1' },
    { grade: 'x2', subgrade: 'y2' },
    { grade: 'x3', subgrade: 'y3' },
]);

然后在您的组件中,您可以执行下面的A或B :

A

    private termsGradeSub: Subscription;
    public grades: LoanGrade[];
    
    ngOnInit(): void {
        this.termsGradeSub = this.termGradeService.termGradeData$.subscribe((grades) => {
            this.grades = grades; // "pull" the grades out of the observable, and save it to a local variable
        });
    }

    // ...
    ngOnDestroy() {
        this.termsGradeSub?.unsubscribe();
    }

并在您的html中:

<ng-container *ngFor="let item of grades">
   <tr>
       <td><span>{{ item.grade }}</span></td> 
   </tr>
</ng-container>

B(读取可观察值的首选方式):
在组件内部:

public termGradeData$: Observable<LoanGrade[]>;

ngOnInit() {
    this.termGradeData$ = this.termGradeService.termGradeData$;
} 

并在 html 中使用 async 管道:

<ng-container *ngFor="let item of grades | async">
   <tr>
       <td><span>{{ item.grade }}</span></td> 
   </tr>
</ng-container>

In your service, make sure to write the observable with LoanGrade[] type:

export interface LoanGrade {
    grade: string;
    subgrade: string;
}

@Injectable({ providedIn: 'root' })
export class TermGradeService {
    public termGradeData$: Observable<LoanGrade[]>;
}

and that somewhere in the code it gets a value (for example, by connecting it to an http.get method).

If you need to set a value for it by yourself, you can use 'BehaviorSubject` as follows:

export interface LoanGrade {
    grade: string;
    subgrade: string;
}

const initalLoanGradesValue: LoanGrade[] = [];

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

    private _termGradeData$: BehaviorSubject<LoanGrade[]> = new BehaviorSubject<LoanGrade[]>(initalLoanGradesValue);

    get termGradeData$() {
        return this._termGradeData$.asObservable();
    }

    // ...
}

then somewhere in the code, make sure a value is emitted through the BehaviorSubject:

this._termGradeData$.next([
    { grade: 'x1', subgrade: 'y1' },
    { grade: 'x2', subgrade: 'y2' },
    { grade: 'x3', subgrade: 'y3' },
]);

Then in your component, you can do either A or B below:

A

    private termsGradeSub: Subscription;
    public grades: LoanGrade[];
    
    ngOnInit(): void {
        this.termsGradeSub = this.termGradeService.termGradeData$.subscribe((grades) => {
            this.grades = grades; // "pull" the grades out of the observable, and save it to a local variable
        });
    }

    // ...
    ngOnDestroy() {
        this.termsGradeSub?.unsubscribe();
    }

and in your html:

<ng-container *ngFor="let item of grades">
   <tr>
       <td><span>{{ item.grade }}</span></td> 
   </tr>
</ng-container>

or

B (preferred way of reading observables):
inside the component:

public termGradeData$: Observable<LoanGrade[]>;

ngOnInit() {
    this.termGradeData$ = this.termGradeService.termGradeData$;
} 

and use the async pipe in your html:

<ng-container *ngFor="let item of grades | async">
   <tr>
       <td><span>{{ item.grade }}</span></td> 
   </tr>
</ng-container>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文