【发布时间】:2017-07-23 17:53:24
【问题描述】:
我很难让 .subscribe() 方法在 Angular 2 中触发一个可观察对象。我的设置是一个提供程序,它向 Http Service 注入一个方法,该方法返回控制器可以与之交互的可观察对象,并订阅到。
我不清楚为什么当方法返回可观察对象并且控制器将订阅链接到该对象时订阅不会触发。非常感谢任何帮助。
用户提供者
@Injectable()
export class UserResource {
constructor( protected http: Http ) {}
public getUsers(): Observable<User[]> {
return this.http.get( '/api/users' )
.map( (response: Response) => <User[]>response.json() )
.catch( (error: Response | any) => {
console.log( error );
return Observable.throw( error );
});
}
}
用户控制器
export class UsersController {
public usersEnrolled: User[] = [];
public usersUnenrolled: User[] = [];
constructor( private userResource: UserResource ) {}
ngOnInit() {
this.userResource.getUsers()
.subscribe(( users: User[] ) => {
console.log( 'users', users ); // does not fire
this.usersUnenrolled = users.filter( (user: User) => !user.isEnrolled );
this.usersEnrolled = users.filter( (user: User) => user.isEnrolled );
},
( error ) => console.log( 'error', error ),
() => console.log( 'completed' )
);
}
}
更新的订阅包括错误和完成的回调
请注意,为了代码简洁,我排除了 import 语句。
【问题讨论】:
-
不确定这是否是问题所在,但请尝试使用完整的 url 请求,例如:
this.http.get('http://localhost:8080/api/users')(或任何主机名) -
thx @lenny 为了简洁起见,我保留了它,但它确实在我的实际代码中包含主机。 :)
-
或者类型有问题,使用
any而不是User会发生什么? -
其实调试这个问题的更清晰的方法是在你的Sources面板中设置一个调试断点,或者在你想要开始的地方添加
debugger;语句并遵循执行路径。跨度> -
.map( (response) => console.log(response.json()) )打印出来的是什么?
标签: angular rxjs angular2-observables