角度打字稿页面上的数组为空

Posted

技术标签:

【中文标题】角度打字稿页面上的数组为空【英文标题】:Array is empty on angular typescript page 【发布时间】:2020-11-29 04:40:05 【问题描述】:

我正在用一个名为“getQuestionsWithInterviewId”的函数填充我的字符串“Questions”,但是当我在 ngOnInit 和 ngAfterContentInit 方法中使用 console.log 调用它时,它看起来是空的。

import  Component, OnInit  from '@angular/core';
import  QuestionService  from '../_services/question.service';
import  Question  from '../_models/model';

@Component(
   selector: 'app-interview',
   templateUrl: './interview.component.html'
 )

 export class InterviewComponent implements OnInit 

 questions: Question[]=[];

 constructor(private questionService: QuestionService) 

 

 ngOnInit(): void 
 

 ngAfterContentInit() 
    this.getQuestionsWithInterviewId(1);
    console.log(this.questions);

    $(".tab-wizard").steps(
      headerTag: "h6",
      bodyTag: "section",
      transitionEffect: "fade",
      titleTemplate: '<span class="step">#index#</span> #title#',
      labels: 
        finish: "end"
      ,
      onFinished: function (event, currentIndex) 
        alert("end");
      
    );

  

  getQuestionsWithInterviewId(interviewId: number) 
    this.questionService.getQuestionsWithInterviewId(interviewId).subscribe(a => 
    this.questions = a;
  ,
  error => 
    console.log(error);
  );
 


但是当我在 component.html 页面上使用 'questions' 数组时,我可以看到结果。

如果我在 'getQuestionsWithInterviewId' 函数中执行 console.log 操作,我可以获得结果。

getQuestionsWithInterviewId(interviewId: number) 
this.questionService.getQuestionsWithInterviewId(interviewId).subscribe(a => 
  this.questions = a;
  console.log(this.questions);
,
  error => 
    console.log(error);
  );
 

question.service.ts 页面;

import  Injectable  from '@angular/core';
import  HttpClient  from '@angular/common/http';
import  Observable  from 'rxjs';
import  Question  from '../_models/model';

@Injectable(
  providedIn: 'root'
)
export class QuestionService 

  baseUrl: string = 'https://localhost:44388/api/questions/';

  constructor(private http: HttpClient) 

  

  getQuestionsWithInterviewId(interviewId: number): Observable<Question[]> 
    return this.http.get<Question[]>(this.baseUrl + 
"GetQuestionsWithInterviewId/" + interviewId);
  



【问题讨论】:

【参考方案1】:

这是因为 getQuestionsWithInterviewId 使用了来自 questionService 的 observable。

questions 在您分配 this.questions = a 时填充。当订阅被触发时会发生这种情况。仅在所有调用堆栈为空后才会触发订阅。所以这发生在ngAfterContentInit 完成执行之后。

要对订阅中的数据执行操作,您必须在 subscribe 回调中进行操作。

更新

ngOnInit()    
    this.questionService.getQuestionsWithInterviewId(1).subscribe(a => 
      this.questions = a;
      // this console log will do
      console.log(this.questions);
      // feel free to do your magic with questions here
    ,

【讨论】:

我该怎么办?我分享了 question.service.ts 页面 @pbachman 发布了功能示例。在他的情况下,控制台日志将正确记录问题【参考方案2】:

您的组件中不需要额外的方法“getQuestionsWithInterviewId”,您可以直接调用该服务。我建议在 ngOnInit 上执行此操作,如下所示:

ngOnInit()    
    this.questionService.getQuestionsWithInterviewId(1).subscribe(a => 
      this.questions = a;
      console.log(this.questions);
    ,
    error => 
        console.log(error);
      );
    
    
    $(".tab-wizard").steps(
        headerTag: "h6",
        bodyTag: "section",
        transitionEffect: "fade",
        titleTemplate: '<span class="step">#index#</span> #title#',
        labels: 
          finish: "end"
        ,
        onFinished: function (event, currentIndex) 
          alert("end");
        
     );

【讨论】:

以上是关于角度打字稿页面上的数组为空的主要内容,如果未能解决你的问题,请参考以下文章

如何将从webapi返回的自定义对象数组的HttpResponse响应分配给打字稿角度中相同数组类型的对象?

如何通过两个对象打字稿角度6进行比较

在有角度的 HTML 页面中使用 Typescript 枚举的正确方法(例如,有角度的 ng-class)

查找和替换打字稿角度

在角度/打字稿中将类创建为可迭代

将数据从 HTML 页面传递到打字稿文件