当前位置: 首页 > 知识库问答 >
问题:

Angular2 http observables-如何使用未定义的类型

鄢英哲
2023-03-14

我正在将一些代码从Angular1迁移到Angular2,但有一些问题。我可以打开json响应,填充模板,并从模板ng函数访问数据,但无法直接从组件类访问数据。从我读到的和看到的错误消息来看,Angular2 http/observable似乎没有返回纯json对象,因此我怀疑我需要重新映射它,但不确定如何映射。我相信,使用onPromise也可以回到promise上来,但还没有成功实现。我花了很多时间在谷歌上搜索解决方案,并尝试实现其中的大部分,但运气不佳。如果有人能就如何将响应重新映射为可用格式或直接访问响应中的数据提供建议,将不胜感激。

来自服务的http调用示例:-

getExam() {
    return this._http.get('/json/exam.json')
      .map(data => data.json());
  }

订阅示例:-

  ngOnInit() {
      this._examsService.getExam()
        .subscribe(response => this.exam = response);
    console.log(this.exam.length);  //this fails
  }

控制台日志错误示例:-

TypeError: Cannot read property 'length' of undefined in [null]

示例数据结构(非常简化的测试):-

{"title":"My Practice Exam",
  "questions":[
    {"question":"1+1 = ",
      "answers":[
        {"answer":"2","correct":"Y","selected":"N","iscorrect":""},
        {"answer":"5","correct":"N","selected":"N","iscorrect":""}]},
    {"question":"2+2 = ",
      "answers":[
        {"answer":"4","correct":"Y","selected":"N","iscorrect":""},
        {"answer":"7","correct":"N","selected":"N","iscorrect":""}]},
    {"question":"3+3 = ",
      "answers":[
        {"answer":"6","correct":"Y","selected":"N","iscorrect":""},
        {"answer":"8","correct":"N","selected":"N","iscorrect":""}]}]}

在Angular1中,我能够直接从函数中访问数据-例如,如下所示,并希望在Angular2中做类似的操作

if ($scope.myExams[0].questions[q].answers[a].correct == 'y') ...

共有2个答案

林夕
2023-03-14

我认为以下情况是正常行为:

ngOnInit() {
  this._examsService.getExam()
    .subscribe(response => this.exam = response);
  console.log(this.exam.length);  //this fails
}

因为您尝试访问稍后设置的考试对象上的长度属性以及响应何时出现(在订阅方法中)。

也就是说,当在可观察对象中抛出错误时,不会调用map运算符。如果要转换错误响应,可以利用catch运算符,如下所述:

this._examsService.getExam()
    .subscribe(
      // Success
      response => this.exam = response,
      // Failure
      response => {
        // Do something
      });

以及相应的服务代码:

getExam() {
  return this.http.get('http://...')
           .map(res = > res.json())
           .catch(res => {
             // If you want to extract the JSON error
             // message from the response
             return Observable.throw(res.json());
           });
}

否则,您也可以利用async管道直接设置组件上的可观察对象,而不执行订阅:

this.exam = this._examsService.getExam();

并在相关模板中

<ul>
  <li *ngFor="#e of exam | async">{{e.name}}</li>
</ul>

希望对你有帮助蒂埃里

雍宇定
2023-03-14

使用此代码

ngOnInit() {
  this._examsService.getExam()
    .subscribe(response => this.exam = response);
  console.log(this.exam.length);  //this fails
}

第一行发送请求this_ExamService。getExam()。订阅(…)并在响应中注册兴趣,然后控制台。log(this.exam.length)被执行,但此时响应=

您需要保持在事件链中,才能处理最终返回的数据,如:

ngOnInit() {
  this._examsService.getExam()
    .subscribe(response => {
      this.exam = response;
      console.log(this.exam.length);  //this shoudn't fail anymore
    });
}

我不知道这是否解决了你的问题,但你的问题没有提供足够的信息,说明你需要更详细的解决方案。

 类似资料:
  • 问题内容: 有什么好的方法可以帮助您识别项目中未使用的CSS定义?一堆css文件被拉进来了,现在我正在尝试清理一些东西。 问题答案: Chrome开发者工具有一个“ 审核”标签,其中可以显示未使用的CSS选择器。 运行审核,然后在“ 网页性能”下,参阅“ 删除未使用的CSS规则”

  • 问题内容: 实施自己的最佳方法是哪一种? 其实我得到一个问题登记。如果我在中使用自定义类,则管理页面上不会显示任何应用程序。 我用一个小技巧解决了这个问题。我写了这个课: 并像这样实现我的自定义AdminSite: 所以,我可以用这个为。 有人知道更好的方法吗?由于我以下划线开头访问var,所以它不过是hack。我不喜欢黑客。 编辑:另一种方法是重写函数,但是在这种情况下,我将有冗余代码。 问题答

  • 问题内容: 我想将非spring bean类对象用作球衣Web服务类方法的参数。但是它在构建时会给出缺少的依赖项错误。 我的代码是: 问题答案: 关键是路径参数以字符串形式出现。根据规范,如果我们希望将自定义类型作为注入,则自定义类应具有以下三项之一: 返回类型的公共静态 返回类型的公共静态 或接受字符串的公共构造函数 另一种选择实现。您可以在此处查看示例。 如果您不拥有该类(它是无法更改的第三方

  • 这将是在Windows机器上,我知道指针大小INT-PTR是64位宽。然后我可以使用CV_64,但只定义了CV_64F。因为我不会用这个矩阵做任何计算,我能用它来存储指针吗。我在想,在读取第一个图像之前,我将获得大小,创建这个矩阵,使用“new std::vector”为每个像素创建向量,并将该指针存储在元素中。在计算的循环中,我使用相同的访问偏移量来读取原始图像并将输出存储在向量中。当我处理完这

  • 我是新来的。我有一个关于Firebase Auth/ Google Auth的问题,FirebaseUser未定义代码: Pubspec.yml 我在AuthResult上也面临同样的问题