Angular 2 中带有 Observable 的 http 无法使用数据

2023-12-11

我是 Angular 2 和 Observables 的新手,但我想尝试一下。所以我安装了 angular-cli 并做了一个简单的测试项目。

我想要它做的就是读取一个 json 文件并处理组件内部的数据(第一个目的是提供服务,但我想从低基础开始)。

所以我在assets/json文件夹中创建了一个json文件(testjson.json):

{
  "teststring": "test works"
}

然后我从 Angular 导入了 http,并在 content.component.ts 文件中导入了 rxjs 地图内容:

import { Component, OnInit } from '@angular/core';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';

@Component({
  selector: 'app-content',
  templateUrl: './content.component.html',
  styleUrls: ['./content.component.css']
})
export class ContentComponent implements OnInit {

  title: string = "Default";
  data;

  constructor(private http:Http) {
    http.get('assets/json/testjson.json').map(res => res.json()).subscribe(data => {this.data = data; this.title = data.teststring; console.log(this.data);});
  }

  ngOnInit() {

  }

}

到目前为止一切顺利,应用程序打印出以下内容:

app works!

test works [object Object]

但我想在整个组件中使用这些数据,而不仅仅是在构造函数中。但如果我尝试在构造函数之外(在 ngOnInit 函数内)console.log“this.data”,它会在控制台中打印 undefined 。

我知道,它一定与异步加载有关,但不幸的是我不知道如何告诉应用程序等待 this.data 被填充。

我希望你能帮助我。当然,将来我想要一种可以执行此类操作的服务,并且多个组件应该从中获取数据。

提前致谢!


  • 您应该将初始化代码移至初始化方法。
  • 回调完成后,您的数据就可用。在您的模板中您可以使用*ngIf一旦有数据就执行块内的代码。只要*ngIf不评估为 true 内部代码将不会运行。
  • 你唯一能跑的方法console.log(data)是来自回调内部或从回调中调用,因为您必须等待数据加载。

内容.组件.html

<div *ngIf="data">
  <span>{{data.teststring}}</span>
</div>

内容.组件.ts

export class ContentComponent implements OnInit {

  title: string = "Default";
  data: any = null;

  constructor(private http:Http) {
  }

  ngOnInit() {
    this.http.get('assets/json/testjson.json')
      .map(res => res.json())
      .subscribe(data => {
        this.data = data;
        this.title = data.teststring;
        console.log(this.data);
      });
  }
}

Edit

回应下面的评论如果您抽象出对服务的 http 调用,您可以看到完全相同的逻辑仍然适用。您仍在使用数据承诺的概念,并且一旦完成,您就可以订阅该承诺。这里唯一的区别是 http 调用被抽象到不同的类。

内容.组件.ts

export class ContentComponent implements OnInit {

  title: string = "Default";
  data: any = null;

  // inject service
  constructor(private contentService:ContentService) {
  }

  ngOnInit() {
    this.contentService.getData()
      .subscribe(data => {
        this.data = data;
        this.title = data.teststring;
        console.log(this.data);
      });
  }

Service

export class ContentService {

  constructor(private http:Http) {
  }

  getData(): IObservable<{teststring:string}> { // where string can be some defined type
    return http.get('assets/json/testjson.json')
      .map(res => res.json() as {teststring:string});
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 2 中带有 Observable 的 http 无法使用数据 的相关文章

随机推荐

  • 如何为滑块赋予不同的背景颜色?

    我想根据滑块位置为滑块提供两种不同颜色的颜色 一种颜色应位于滑块之前 另一种颜色应位于滑块之后 我使用 CSS 实现了其他设计 这是对输入 type range 进行皮肤处理的代码 input type range border 1px s
  • Request.UrlReferrer 为空?

    在 aspx C NET 页面 我正在运行框架 v3 5 中 我需要知道用户来自哪里 因为他们无法在不登录的情况下查看页面 如果我有页面A 用户想要查看的页面 重定向到页面B 登录页面 Request UrlReferrer 对象为 nul
  • Numpy 字典顺序

    我想按字典顺序对以下数组进行排序a 获取索引位置 但是 我在理解 numpy 结果时遇到问题 gt gt gt a np asarray 1 1 1 2 1 2 2 1 2 3 1 0 1 2 3 3 2 2 gt gt gt a arra
  • 强制浏览器下载 PDF 文档而不是打开它

    我想让浏览器从服务器下载 PDF 文档 而不是在浏览器本身中打开该文件 我正在使用 C 下面是我使用的示例代码 它不起作用 string filename Sample server url response redirect filena
  • 如何使用 C++11 std::thread 设置堆栈大小

    我一直在努力熟悉std 线程C 11 中的库 并且遇到了绊脚石 最初 我来自 posix 线程背景 并且想知道如何在构造之前设置 std thread 的堆栈大小 因为我似乎找不到执行此类任务的任何参考 使用 pthreads 设置堆栈大小
  • 将 SQL Server 2008 地理类型与 nHibernate 的 CreateSQLQuery 结合使用

    我正在尝试使用 nHibernate 2 0 1GA 发出 SQL 更新语句 如下所示 sqlstring string Format set nocount on update myusers set geo geography Poin
  • 更改日期变量的时区

    我有一个字符串 我已将其转换为日期变量 但事实证明时区是错误的 我尝试使用的字符串是 var v 2013 09 05 17 53 05 00 var parsedvalueInField new Date v 如果我发出 parsedva
  • 如何防止元组的并集变成并集的元组?

    尝试编写一个在发生意外 失败 时优雅返回的函数 正在考虑使用 go 风格的函数 return 来 gonig 并将 return 键入为 Val null null Error 但是 当尝试使用 if 语句对返回值进行类型保护时 const
  • 无法通过 apache Camel http 将文件发送到 Rest Web 服务

    我是 Camel 新手 在通过 Camel http 将文件发送到 Web 服务时遇到问题 我有一个 REST Web 服务 它使用多部分表单数据类型内容并接受输入作为表单数据的一部分 当我通过camel发送文件和表单参数时 它在camel
  • 以编程方式创建组:无法通过迁移访问权限

    看到后这个帖子 我尝试通过此迁移在项目设置中创建自己的组 from django db import migrations from django contrib auth models import Group Permission de
  • Discord C# 用户加入消息

    我正在使用 C 中的 Discord Net 来制作一个机器人 到目前为止 我的机器人运行得非常好 但我希望它在用户加入特定服务器时自动为他们分配特定角色 我从未真正学过任何 C 只学过一点 C 所以我知道基本语法 我该怎么办呢 我假设我会
  • 如何针对 R 中的大型矩阵有效计算所有可能组合的归一化比率?

    我想为 R 中的大矩阵有效计算所有可能组合的归一化比率 我之前问过类似的问题here并且在数据较少的情况下 那里提供的解决方案效果很好 但是 当我尝试对大型数据集 400 x 2151 应用相同的解决方案时 我的系统挂起 我的系统配备 16
  • JavaScript - 使用 childNode 遍历 HTML DOM 在非 IE 浏览器中会导致错误

    我的浏览器中呈现了下表 它是从服务器端生成的 table class tblQuestionsContainer border 0 tr td class tdQuestion Are u an indian citizen td tr t
  • Gson 库和 Proguard

    我遇到了 proguard 和 Gson 库的问题 我的代码是 AdServerResult result AdServerResult new Gson fromJson json AdServerResult class 我创建了一个新
  • 为 MIPS 编译 Linux 内核 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我有一台 32 位 MIPS 机器 想在上面运行 Linux 我需要使用我的 Windows 7 机器将 Linux 交叉编译为 MIPS 我对如何解决这个问题感到困惑 有人可以
  • 使用内部联接的简单 hql 命名查询

    我想在我的域 实体对象中做这样的事情 Entity NamedQueries NamedQuery name favouriteCats query from Cat c inner join on UserCat uc where uc
  • 编码麻烦 - 一种格式到另一种格式

    我有一个抓取工具正在从其他地方收集一些我无法控制的数据 源数据包含各种有趣的 Unicode 字符 但它将它们转换为一种非常无用的格式 因此 u00e4 对于带有元音变音的小 a 没有我认为应该存在的双引号 当然 这会在我的 HTML 中以
  • 比较方法违反了它的一般契约!仅限 Java 7

    我知道这个问题已经有一段时间了 并检查了我之前能得到的所有答案 但这个仍然不起作用 对象 crew 代表具有等级和其他项目的船员 应通过比较 int 值 signed rank 来进行比较 如果两个实例中该值相等 则布尔值 is train
  • Javascript - 在网站上创建文本文件

    所以我有一个网页 我想以编程方式在我的网站上的新目录中创建一个文本文件 假设它包含 你好 我是一个文本文件 该程序将位于网站的另一个目录中 e g https www example com txtbuild html正在尝试以编程方式制作
  • Angular 2 中带有 Observable 的 http 无法使用数据

    我是 Angular 2 和 Observables 的新手 但我想尝试一下 所以我安装了 angular cli 并做了一个简单的测试项目 我想要它做的就是读取一个 json 文件并处理组件内部的数据 第一个目的是提供服务 但我想从低基础