Angular2,EventEmitter上的订阅属性不存在?

时间:2016-07-07 15:12:51

标签: javascript angular typescript

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

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

我的问题是我收到了错误&#34;在EventEmitter&lt; {}&gt;&#34;类型中不存在属性怀疑。

3 个答案:

答案 0 :(得分:3)

这是一个错字

使用subscribe,而不是suscribe

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

  1. emit()返回void
  2. EventEmitter扩展(继承)Subject这是一个可观察的观察者。

    export declare class EventEmitter<T> extends Subject<T>
    
  3. EventEmitter是一个带有一些修改的rxjs主题,最值得注意的是它不使用next()在流中发送值但使用emit()。 它还允许设置异步逻辑,其中emit将是异步。

答案 1 :(得分:2)

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

  

从“ 事件”导入{EventEmitter};

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

  

从' @ angular / core '导入{EventEmitter};

答案 2 :(得分:0)

它没有订阅方法,因为它不返回observable。

emit()的{​​{1}}方法会返回一个observable,因此您需要创建一个与发出的事件相关的输入。 然后,您可以订阅此。

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