Angular 5订阅不是一个功能

时间:2018-06-17 16:41:01

标签: angular observable httpclient subscribe

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操作员......

4 个答案:

答案 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单元测试中运行,我定义了一个自定义模拟,而该模拟未返回可观察到的结果。在这种情况下,很容易弄乱模拟并返回不同的类型,然后返回要模拟的实际函数。更正我的模拟程序可以解决我的问题。