Javascript 角度2:事件未触发
我试图在我的组件从服务获取已登录用户时触发事件,因为我只想在用户登录时显示导航栏 以下是我的应用程序组件代码:Javascript 角度2:事件未触发,javascript,angularjs,angular,angular2-template,angular2-changedetection,Javascript,Angularjs,Angular,Angular2 Template,Angular2 Changedetection,我试图在我的组件从服务获取已登录用户时触发事件,因为我只想在用户登录时显示导航栏 以下是我的应用程序组件代码: import { Component, OnInit, EventEmitter, Input, Output } from '@angular/core'; import { ROUTER_DIRECTIVES, Router } from '@angular/router'; import { LoginComponent } from './login.component'; i
import { Component, OnInit, EventEmitter, Input, Output } from '@angular/core';
import { ROUTER_DIRECTIVES, Router } from '@angular/router';
import { LoginComponent } from './login.component';
import { DashboardComponent } from './dashboard.component';
import { ControlDetailComponent } from './control-detail.component';
import { PageNotFoundComponent } from './pagenotfound.component';
import { SettingsComponent } from './settings.component';
import { UserService } from '../service/user.service';
import { User } from '../object/user';
@Component({
selector: 'myApp',
templateUrl: './app/template/app.component.html',
styleUrls: ['styles.css'],
directives: [ROUTER_DIRECTIVES],
precompile: [LoginComponent, DashboardComponent, ControlDetailComponent, PageNotFoundComponent, SettingsComponent]
})
export class AppComponent {
@Input() loggedUser:User;
@Output() userChanged:EventEmitter<User> = new EventEmitter<User>();
constructor(private _userService:UserService, private _router:Router) {}
ngAfterViewInit() {
if(this._userService.isUserLogged()) {
this.userChanged.emit(this._userService.loggedUser);
}
}
switchUser(event) {
this.loggedUser = event.target.value;
console.log("event triggered");
}
}
从'@angular/core'导入{Component,OnInit,EventEmitter,Input,Output};
从“@angular/ROUTER”导入{ROUTER_指令,ROUTER}”;
从“./login.component”导入{LoginComponent};
从“./dashboard.component”导入{DashboardComponent};
从“./control detail.component”导入{ControlDetailComponent};
从“./pagenotfound.component”导入{PageNotFoundComponent};
从“./settings.component”导入{SettingsComponent};
从“../service/user.service”导入{UserService};
从“../object/User”导入{User};
@组成部分({
选择器:“myApp”,
templateUrl:'./app/template/app.component.html',
样式URL:['styles.css'],
指令:[路由器指令],
预编译:[LoginComponent、仪表板组件、ControlDetailComponent、PageNotFoundComponent、SettingsComponent]
})
导出类AppComponent{
@Input()loggedUser:用户;
@Output()userChanged:EventEmitter=neweventemitter();
构造函数(private _userService:userService,private _router:router){}
ngAfterViewInit(){
if(this.\u userService.isUserLogged()){
this.userChanged.emit(this.\u userService.loggedUser);
}
}
开关用户(事件){
this.loggedUser=event.target.value;
控制台日志(“事件触发”);
}
}
这是它的关联模板:
<div class="all-content">
<nav (userChanged)="switchUser($event)" *ngIf="loggedUser">
<ul>
<a [routerLink]="['/dashboard']" routerLinkActive="active">Dashboard</a>
<a [routerLink]="['/settings']" routerLinkActive="active">Settings</a>
<a (click)="logout()">Logout</a>
</ul>
</nav>
仪表板
设置
注销
有人知道为什么我的活动没有被取消吗
起初,我认为问题在于阻止触发事件的
*ngIf
指令,但即使删除了该指令,事件也不会被触发 由@Output()
s发出的事件只能在父组件或应用于元素的指令上订阅。AppComponent
没有父组件,因此这种方法不起作用
在您的情况下,最好使用带有可观察对象的共享服务。
由
@Output()
s发出的事件只能在父组件或应用于元素的指令上订阅。AppComponent
没有父组件,因此这种方法不起作用
在您的情况下,最好使用带有可观察对象的共享服务。
按照Günter Zöchbauer的建议(谢谢!),使用
观测值和服务解决问题
下面是我的解决方案:
user.service.ts
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import { Subject } from 'rxjs/Subject';
import { Control } from '../object/control';
import { User } from '../object/user';
@Injectable()
export class UserService {
private userChangedSource = new Subject<User>();
userChanged = this.userChangedSource.asObservable();
loggedUser:User;
userLoggedIn(user:User) {
this.loggedUser = user;
this.userChangedSource.next(user);
}
...
}
import { Component, OnInit, EventEmitter, Input, Output } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { ROUTER_DIRECTIVES, Router } from '@angular/router';
import { LoginComponent } from './login.component';
import { DashboardComponent } from './dashboard.component';
import { ControlDetailComponent } from './control-detail.component';
import { PageNotFoundComponent } from './pagenotfound.component';
import { SettingsComponent } from './settings.component';
import { UserService } from '../service/user.service';
import { User } from '../object/user';
@Component({
selector: 'myApp',
templateUrl: './app/template/app.component.html',
styleUrls: ['styles.css'],
directives: [ROUTER_DIRECTIVES],
precompile: [LoginComponent, DashboardComponent, ControlDetailComponent, PageNotFoundComponent, SettingsComponent]
})
export class AppComponent implements OnInit {
loggedUser:User;
constructor(private _userService:UserService, private _router:Router) {
this._userService.userChanged.subscribe(user => {
this.loggedUser = user;
console.log("event triggered");
});
}
...
}
app.component.html
<div class="all-content">
<nav *ngIf="loggedUser" >
<ul>
<a [routerLink]="['/dashboard']" routerLinkActive="active">Dashboard</a>
<a [routerLink]="['/settings']" routerLinkActive="active">Settings</a>
<a (click)="logout()">Logout</a>
</ul>
</nav>
<router-outlet></router-outlet>
<br/>
</div>
仪表板
设置
注销
按照Günter Zöchbauer的建议(谢谢!),使用观测值和服务解决问题
下面是我的解决方案:
user.service.ts
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Observable } from 'rxjs/Rx';
import { Subject } from 'rxjs/Subject';
import { Control } from '../object/control';
import { User } from '../object/user';
@Injectable()
export class UserService {
private userChangedSource = new Subject<User>();
userChanged = this.userChangedSource.asObservable();
loggedUser:User;
userLoggedIn(user:User) {
this.loggedUser = user;
this.userChangedSource.next(user);
}
...
}
import { Component, OnInit, EventEmitter, Input, Output } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { ROUTER_DIRECTIVES, Router } from '@angular/router';
import { LoginComponent } from './login.component';
import { DashboardComponent } from './dashboard.component';
import { ControlDetailComponent } from './control-detail.component';
import { PageNotFoundComponent } from './pagenotfound.component';
import { SettingsComponent } from './settings.component';
import { UserService } from '../service/user.service';
import { User } from '../object/user';
@Component({
selector: 'myApp',
templateUrl: './app/template/app.component.html',
styleUrls: ['styles.css'],
directives: [ROUTER_DIRECTIVES],
precompile: [LoginComponent, DashboardComponent, ControlDetailComponent, PageNotFoundComponent, SettingsComponent]
})
export class AppComponent implements OnInit {
loggedUser:User;
constructor(private _userService:UserService, private _router:Router) {
this._userService.userChanged.subscribe(user => {
this.loggedUser = user;
console.log("event triggered");
});
}
...
}
app.component.html
<div class="all-content">
<nav *ngIf="loggedUser" >
<ul>
<a [routerLink]="['/dashboard']" routerLinkActive="active">Dashboard</a>
<a [routerLink]="['/settings']" routerLinkActive="active">Settings</a>
<a (click)="logout()">Logout</a>
</ul>
</nav>
<router-outlet></router-outlet>
<br/>
</div>
仪表板
设置
注销