从打字稿和 Angular 中的 Observable 获取字符串值

2024-04-25

我想从 Observable 获取字符串值并将该值从函数返回给调用者函数。

例如: 我有一组键,想一一获取所有键的值(字符串)并将其显示在具有菜单栏的 html 组件中。

这是 ts 文件:

key-list.component.ts

public data = [ { 'key': 1, 'value' : this.getValue(1)}, 
                { 'key': 2, 'value' : this.getValue(2)}, 
                ...
              ];

private getValue(key: number): string {
    return this.keyService.find(key).subscribe(response => {
         return response;
    });
}

keyService.ts

...
public find(key:number): Observable<any> {
  return this.http.get(`/api/keys/${key}`).map(res => res.json() || {});
}
...

我想显示 html 组件中的所有值。 但在 key-list.component.ts 中出现错误,可观察到字符串类型。

我如何解决这个订阅方法并确保 getValue 应始终返回字符串,并使其完美无缺。

解决方案之一是:

private getValue(key: number): string {
        let result: string;
        this.keyService.find(key).subscribe(res => result = res);
        return result;
    }

上述解决方案并不总是有效。 此类问题有哪些替代解决方案?


你正在尝试返回Observable从函数getValue, and return response or return result不起作用,因为请求http.get is 异步.

以下是您可以执行的一些选项:

Option1: using 异步管道在您的模板中订阅以下结果http.get并从函数中删除订阅部分getValue.

<div *ngFor="let item of data">
  <span>{{item.value | async}}</span>
</div>

// return Observable and subscribe by async pipe at template
private getValue(key: number): string {
  return this.keyService.find(key);
}

Option2:定义数组data没有value字段并稍后更新其值字段。但要小心的是value场将是undefined除非你得到回复this.keyService.find(key).

public data = [
  { 'key': 1}, 
  { 'key': 2}, 
  ...
];

constructor() {
  this.data.forEach(item => {
    this.keyService.find(item.key).subscribe(response => {
      item.value = response;    // update value field here.
    });
  });
}

// here getValue function is no longer necessary.

希望这会有所帮助。


来自OP的更新

通过对上述选项进行一些细微的更改,它的效果就像魅力一样。

以下是变化:

<div *ngFor="let item of data">
  <span>{{ getValue(item.key) | async}}</span>
</div>

public getValue(key: number): any {
  return this.keyService.find(key);
}

感谢提醒使用异步管道@Pengyy(来自OP)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从打字稿和 Angular 中的 Observable 获取字符串值 的相关文章

随机推荐

  • Chartjs 插件数据标签不在图表上显示值

    我正在尝试使用 Chartjs 数据标签插件获取每个条形上的值 因此 在 a 条上方 a 想要看到数字 30 在 b 条上方或内部我想看到数字 50 但它根本没有显示任何价值 谁能帮忙并告诉我出了什么问题吗 我也尝试过使用不同版本的char
  • 让隐藏的div出现然后消失?

    让 div 出现然后淡出几秒钟的最简单方法是什么 fade div visibility none position fixed background color yellow border 1px solid black top 300p
  • 单个 CMakeLists.txt 足以满足我的项目需求吗?

    我正在尝试将旧的 CMake 移植到现代 CMake CMake 3 0 2 或更高版本 在旧的设计中 我有多个 CMakelists txt 每个目录都包含一个 CMakeLists txt 文件 我当前项目的目录结构如下所示 VizSi
  • 如何在describe()的before()块中动态生成Mocha测试?

    我正在创建一个 mocha 测试套件 该套件正在测试我们的 nwjs 应用程序正在调用的命令行实用程序 该实用程序获取文件并生成输出 json 文件 我有数千种输入文件组合和我想要生成的测试 it s 具体取决于 cmdline 实用程序的
  • 如何在 x 轴上显示每个元素的标签?

    我有包含文件名和编号的元组序列 我想绘制柱形图 其中 X 轴上有文件名 我的问题是现在 X 轴下仅显示 3 个标签 文件名 这可能是因为屏幕无法容纳更多内容 还是X轴间隔错误 如何让图表显示所有文件名 也许有办法将这些标签逆时针旋转 90
  • CSS 中具有透明背景的锯齿状边缘

    使 div 的顶部和底部边框具有锯齿状边缘 https stackoverflow com questions 18972888 make a divs top and bottom border have a jagged edge 根据
  • 如何将嵌套数据结构作为 LitElement 中的属性传递?

    在父组件中我有类似的内容 render gt const data a 1 b 1 2 3 of course this is a simplified version of the code return html
  • 为什么 Nginx 以相反的顺序提供客户端 SSL DN?

    我很好奇为什么某些 Web 服务器 例如 Nginx 以相反的顺序提供客户端 SSL DN Web 应用程序将 DN 发布到 Java Web 服务 该服务尝试创建 Javajavax naming ldap LdapName http d
  • 获取 UITableView 滚动到选定的 UITextField 并避免被键盘隐藏

    我有一个UITextField在表视图中UIViewController not a UITableViewController 如果表视图位于UITableViewController 表格会自动滚动到textField被编辑以防止它被键
  • 使用 Django 表单集保存具有唯一属性的多个对象

    TL DR 如何使用表单集保存 验证具有唯一属性的多个对象 假设我有一个Machine其中有多个Settings 参见下面的型号 这些设置在机器内应具有唯一的顺序 这可以通过定义一个来完成unique together属性中的Meta的类别
  • 创建通用 Json 序列化函数

    是否可以使用 Play Framework 2 2 在 Scala 中创建一个通用函数 将任意对象序列化为 JSON 而无需提供编写器或格式化程序 例如 此非通用代码将创建给定客户的 JSON 响应 import play api libs
  • this.props.history.push("/") 没有将我重定向到主页

    我正在尝试将此登录页面重定向到主页 但出于某种原因this props history push 没有重定向它 我有一个handleSubmit它应该在我按下登录按钮后运行 我不太确定发生了什么事 按登录按钮运行handleSubmit但是
  • 使用 casperjs 测试损坏的 html

    我试图在运行一些 CasperJs 浏览器测试之前运行一些设置例程 有一次我无法填写表单数据 因为有一些错误的 HTML 表单标签在表格中错误放置 table table
  • 内部接口?

    我对 Java 很陌生 我不明白这个结构是什么 我知道什么是接口以及如何定义 但在这种情况下 我真的不知道 你能说说是关于什么的吗 public interface WebConstants public interface Framewo
  • 在 Java 中实现常量的最佳方式是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动
  • 如何列出我在 Team Foundation Server 中签入的所有文件?

    我怎样才能列出最后一个x我签入到 TFS 的文件 Using the TFS PS Snapin included with the TFS PowerToys1 Get TfsItemHistory recurse stop 50 use
  • 在 mysql 中搜索带变音符号的阿拉伯语

    所以我有一个巨大的带有变音符号的阿拉伯语书面文本数据库 变音符号是阿拉伯语中附加到其他字符的小字符 例如 带变音符号 不带变音符号 我正在使用 mysql 和 laravel 在文本中搜索没有变音符号的特定单词 如何忽略搜索中的变音符号 看
  • Django:时区问题

    注意 我删除了之前存在的问题 并在此处仅提供相关信息 我们的数据库服务器 RH 指定了 TIME ZONE Europe London 并且 在 Django settings py 中 我们指定 TIME ZONE America New
  • MySQLi PHP:使用 MySQLi 检查 SQL INSERT 查询是否完全成功

    我有一个大函数 可以获取大量不同的数据并将其插入到多个表中 并非所有数据始终可用 因此并非所有 SQL INSERT 查询都会成功 我需要检查哪个 SQL INSERT 查询完全成功 哪个 SQL INSERT 查询没有对这些数据执行某些操
  • 从打字稿和 Angular 中的 Observable 获取字符串值

    我想从 Observable 获取字符串值并将该值从函数返回给调用者函数 例如 我有一组键 想一一获取所有键的值 字符串 并将其显示在具有菜单栏的 html 组件中 这是 ts 文件 key list component ts public