Angular返回错误:错误:未捕获(在承诺中):TypeError:res.users.subscribe不是函数。
从今天早上起,我不明白我的决心是什么错误。
UserService.ts
import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
@Injectable()
export class UsersService {
private api = 'http://localhost:3000/users';
private headers = new HttpHeaders();
constructor(
private http: HttpClient
) {}
getAllUsers(): Observable<any[]> {
return this.http.get<any[]>(this.api, {headers: this.headers, responseType: 'json' });
}
}
UserResolve.ts:
import { Injectable } from '@angular/core';
import { Resolve } from '@angular/router';
import { UsersService } from '../services/users.service';
@Injectable()
export class UsersResolve implements Resolve<any> {
constructor(private usersService: UsersService) {}
resolve() {
return this.usersService.getAllUsers();
}
}
UserComponent.ts
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import {Users} from '../_shared/models/Users';
@Component({
selector: 'app-user',
templateUrl: './users.component.html',
styleUrls: ['./users.component.sass']
})
export class UsersComponent implements OnInit {
constructor(private route: ActivatedRoute) {}
public title: string;
public users: Users[] = [];
ngOnInit() {
this.route.data.forEach((res: any): any => {
this.title = res.title;
res.users.subscribe(users => {
console.log(users);
this.users = users;
});
});
}
}
当我记录res.users时,它返回&#34;函数UsersResolve()&#34;没有 proto 订阅...
json是Object of Object,如:
{
id: 13246,
guid: '46ffgd456dfs',
name: 'John Doe',
adress: ...
}
问题可能来自我的json的内容吗?
最初,我想训练RxJS操作员......
答案 0 :(得分:2)
您正在对Array应用subscribe。你应该在Observable上做。
尝试应用以下更改.. 一旦理解了数据在控制台上的价值,就可以对数据执行操作。
<强> UserComponent.ts 强>
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import {Users} from '../_shared/models/Users';
@Component({
selector: 'app-user',
templateUrl: './users.component.html',
styleUrls: ['./users.component.sass']
})
export class UsersComponent implements OnInit {
constructor(private route: ActivatedRoute) {}
public title: string;
public users: Users[] = [];
ngOnInit() {
this.route.data.subscribe(data => console.log(data));
}
}
<强>更新强>
如评论中所述:
如果你已经定义了这样的路线:
const appRoutes: Routes =
[ ...
{ path: 'users',
component: UsersComponent,
resolve: {
users : UsersResolve
}
}
];
您应该能够获得以下数据:
ngOnInit() {
this.route.data.subscribe(data => console.log(data['users']));
}
答案 1 :(得分:1)
来自de angular.io doc:
interface ActivatedRoute {
snapshot: ActivatedRouteSnapshot
url: Observable<UrlSegment[]>
params: Observable<Params>
queryParams: Observable<Params>
fragment: Observable<string>
data: Observable<Data>
outlet: string
component: Type<any> | string | null
get routeConfig: Route | null
get root: ActivatedRoute
get parent: ActivatedRoute | null
get firstChild: ActivatedRoute | null
get children: ActivatedRoute[]
get pathFromRoot: ActivatedRoute[]
get paramMap: Observable<ParamMap>
get queryParamMap: Observable<ParamMap>
toString(): string
}
这些数据本身就是可观察的。尝试:
this.route.data.subscribe(data => {
console.log(data);
});
});
请记住,订阅是听到可观察声音的耳朵。
答案 2 :(得分:0)
您可以通过两种方式访问已解析的数据
ActivatedRoute
data
保存当前路线的静态和已解决数据的属性
ActivatedRouteSnapshot
:无法观察的替代方案。
您需要将resolve
属性添加到路由配置中,该配置是每个键指向解析器的对象。
const appRoutes: Routes = [{ path: 'users', component: UsersComponent,
data: { title : 'Liste des Utilisateurs'},
resolve:{ users : UsersResolve } }
]
方法-1
ngOnInit() {
this.route.data.subscribe(value=>{
this.title=value.title;
this.users=value.user;
});
}
的方法:2
ngOnInit() {
this.title=this.route.snapshot.data.title;
this.users=this.route.data.snapshot.user;
}
<强> STACKBLITZ DEMO
强>
答案 3 :(得分:0)
上面的答案是正确的,但是我遇到了一个特殊情况。
被调用的方法是可观察的,并且在应用程序的其他部分中被用作可观察的,但是当我运行它时,它说的是可怕的subscribe is not a function
。
问题是,我正在Jasmine单元测试中运行,我定义了一个自定义模拟,而该模拟未返回可观察到的结果。在这种情况下,很容易弄乱模拟并返回不同的类型,然后返回要模拟的实际函数。更正我的模拟程序可以解决我的问题。