2016-07-07 62 views
1

我的app.component包含网站的<nav>,该网站使用[routerLink]转到不同的页面。它导入每个页面的组件。其中一页是登录页面。如果用户没有登录,我希望导航说登录 - 如果用户是,注销。Angular2,EventEmitter上的订阅属性不存在?

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与前者返回。

我的问题是,我收到错误“属性订阅不存在类型EventEmitter < {}>”。

回答

3

它是一个错字

使用订阅,不suscribe

我没有足够的信誉来回答科拉姆波纹管,但是这是完全不正确的。

1)emit()返回void 2)EventEmitter extends(继承)Subject是一个observable和observer。

出口声明类EventEmitter扩展主题

的EventEmitter是rxjs主题有一些修改,最值得注意的是它不使用next()的发送值往下流,但使用发射()。 它还允许设置异步逻辑,在异步逻辑中发射将是异步的。

+0

谢谢...对不起,我不知道为什么它不工作,因为我跟着别人的例子,然后angular.io文档显示订阅属性...我需要更多的睡眠哈哈。它现在编译,但直到后来才能测试。 – Yifan

+0

ugh ... dat facepalm当我一直不明白为什么suscribe没有定义至少半个小时... –