Angular2,订阅事件发射器上的属性不存在

Angular2, subscribe property on EventEmitter not existing?

本文关键字:属性 不存在 发射器 事件 Angular2      更新时间:2023-09-26

My app.component包含网站的<nav>,该网站使用[routerLink]转到不同的页面。它导入每个页面的组件。其中一个页面是登录页面。如果用户未登录,我希望导航显示登录 - 如果用户登录,则注销。

app.component

my_userO : userO = undefined;
constructor (private my_userS:userS){
    my_userS.userChanged.suscribe(temp => this.updateNav());
updateNav(){ 
    this.my_userO = this.my_userS.getUser(); 
}
logOut(){
    this.my_userS.setUser(undefined);
}

并在其模板中:

<li><a *ngIf="!my_userO" [routerLink]="['LoginPage']">Login</a></li>
<li><a *ngIf="my_userO" [routerLink]="['HomePage']"(click)="logOut()">Logout</a></li>

userS是一个全局服务(它是在main.ts中引导的,而不是在我使用它的任何组件中添加为提供程序),我有这样的:

public userChanged: EventEmitter<{}>
currentUser : userO = undefined;
constructor(private http:Http){
    this.userChanged = new EventEmitter();
}
getLogin(username: string, password: string): Promise<userO>{
    return this.http.get(this.getLoginUrl+username).toPromise().then(response => response.json().data).catch(this.handleError);
}
getUser(){
    return this.currentUser;
}
setUser(x_userO: userO){
    this.currentUser = x_userO;
    this.userChanged.emit(undefined);
}

在登录页面中,我只是运行getLogin然后使用前者返回的内容setUser

我的问题是我收到错误"属性 suscribe 在类型事件发射器<{}>上不存在"。

使用 vscode,自动完成添加了以下行:

从"事件"导入 { 事件发射器 }

;

我必须将其更改为以下内容才能解决此问题。

从"@angular/核心"导入 { 事件发射器 }

;

检查事件发射器的导入

应该是import { EventEmitter } from '@angular/core';

这是一个错字

使用subscribe,而不是suscribe

我没有足够的声誉来回答下面的科勒姆,但这完全不正确。

  1. emit()返回无效
  2. EventEmitter扩展(继承)Subject,这是一个可观察量和一个观察者。

    export declare class EventEmitter<T> extends Subject<T>
    

EventEmitter是一个经过一些修改的 rxjs 主题,最值得注意的是它不使用 next() 向流发送值,而是使用 emit()。它还允许设置一个异步逻辑,其中发射将是异步的。

它没有订阅方法,因为它不返回可观察量。

但是,EventEmitteremit()方法确实返回了一个可观察量,因此您需要创建一个连接到发出的事件的输入。然后,您可以订阅此内容。

看看这个: http://www.syntaxsuccess.com/viewarticle/unit-testing-eventemitter-in-angular-2.0