Angular服务注入后为什么在组件里拿不到数据?

爱学习的曦月 阅读 66

我在Angular里写了个UserService,用HttpClient去请求用户信息,但在组件里调用时总是返回undefined,明明控制台能看到网络请求成功了啊。

我试过把subscribe里的逻辑直接写在service里,也试过用async/await,但组件里还是拿不到值。是不是我哪里搞错了?

<template>
  <div>{{ userInfo?.name }}</div>
</template>

<script setup>
import { onMounted } from 'vue'
import { inject } from 'vue'

const userService = inject('userService')
let userInfo

onMounted(() => {
  userService.getUser().then(res => {
    userInfo = res
  })
})
</script>
我来解答 赞 5 收藏
二维码
手机扫码查看
2 条解答
春景酱~
这个问题的关键在于Vue和Angular的混用方式,以及响应式数据处理的问题。让我一步一步来分析和解决。

首先在Vue组件中使用inject获取的服务实例是没问题的,但问题出在你如何处理异步数据上。Vue 3的响应式系统需要明确知道什么时候数据更新了,而在你的代码里,userInfo这个变量并没有被声明为响应式的。

这里是一个修正后的完整实现:




<template>
<div>{{ userInfo?.name }}</div>
</template>


为什么这样做呢?因为Vue 3的响应式系统需要通过特殊的机制来追踪数据的变化。当你直接对普通变量赋值时,Vue无法检测到这种变化。而使用ref或reactive创建的响应式对象,当内部值发生变化时,Vue能够自动追踪并更新视图。

另外要注意的是,在模板中访问userInfo时,已经不需要额外的判断,因为ref会自动处理undefined的情况。

顺便说一句,如果你还在使用Angular的服务逻辑,记得确认service里的getUser方法确实返回了一个Promise,而不是直接返回数据或者Observable。这可能是另一个容易忽略的地方。

有时候开发到晚上脑子都不太清醒了,这些小细节最容易被忽视,我自己也踩过不少坑呢。
点赞
2026-03-31 23:07
 ___风珍
从你的代码来看,问题可能出在响应式数据绑定上。Angular组件里的数据需要使用Vue的响应式系统来管理。

我的做法是把 userInfo 定义成一个 ref 或者 reactive 变量。这样当数据更新时,视图才能自动刷新。你试试这样改:

import { onMounted, ref } from 'vue'
import { inject } from 'vue'

const userService = inject('userService')
const userInfo = ref(null)

onMounted(() => {
userService.getUser().then(res => {
userInfo.value = res
})
})


记得在模板里用 userInfo.value 访问数据的时候加上 ?. 操作符,确保数据加载前不会报错。

另外一个小建议:虽然你用了 inject 获取服务,但最好还是通过依赖注入的方式在组件中声明 UserService。这样更符合 Angular 的规范,调试起来也方便些。

说真的,这种数据绑定的问题我以前也踩过不少坑,特别是刚从 AngularJS 过来的时候。希望这能帮你解决问题!
点赞
2026-03-30 19:17