【发布时间】:2017-01-20 20:05:47
【问题描述】:
我正在使用@Input 和@Output 练习,这就是问题所在。
在我的家庭组件中,我有以下内容:
<!-- Main Content -->
<div class="container">
<div *ngIf="registered">
<login></login>
</div>
<div *ngIf="!registered">
<register></register>
</div>
</div>
registered 位于HomeComponent.ts
@Component({
selector:'home',
templateUrl:'./home.html',
})
export class HomeComponent {
registered:Boolean = true;
}
我的目标是根据按下的内容更改主组件中的值registered。
如果在导航栏中按下注册,表格将变为注册表格,因为home component中的值已更改。但是,如果按下登录,则会返回。
我把这个稍微复杂了一点,但这是为了学习目的。
在user目录中,我有三个模块,Login、Register和UserService。 UserService imports the components from LoginandRegisterand exports them. I importUserServiceintoNavigationBar`模块。
在home.html 页面中,我想更改我刚刚调用<nav-bar></nav-bar> 的表单
@NgModule({
imports:[
SmartAdminModule,
UserModule //has Login and Register components
],
declarations: [NavigationBarComponent],
exports: [NavigationBarComponent]
})
export class NavBarModule {
}
我正在想办法使用@Output 或@Input 来解决这个问题。
这也在 GitHub 上 HERE 非常感谢任何建议。
----------------在这篇文章的一些建议之后,我就是这样做的,但仍然无法正常工作-------------- ----
我发了UserService
@Injectable()
export class UserService {
public registered: Boolean;
@Output() FormUpdate = new EventEmitter();
public SetUserToRegistered(){
this.registered = true;
this.FormUpdate.emit(this.registered);
}
public SetUserToUnregistered(){
this.registered = false;
this.FormUpdate.emit(this.registered);
}
}
然后我将它注入到home.module.ts
@NgModule({
imports:[
SmartAdminModule,
UserModule,
NavBarModule
],
exports:[HomeComponent],
declarations: [HomeComponent],
providers: [UserService]
})
export class HomeModule {
}
主页组件:
@Component({
selector:'home',
templateUrl:'./home.html',
})
export class HomeComponent {
registered: Boolean;
constructor(private userService: UserService) {
this.registered = this.userService.registered;
}
handleFormUpdate(formUpdate){
//what to do here
}
}
然后我有一个瞬间,我想我会制作Login 和Register 按钮并将userService 注入其中,然后按下该按钮它将更改HomeComponent 中this.registered = this.userService.registered; 的值
NavBar.html
<div>
<button (click)="showRegister()">Register</button>
<button (click)="showLogin()">Login</button>
</div>
导航栏组件:
@Component({
selector:'nav-bar',
templateUrl:'./navigationBar.html',
})
export class NavigationBarComponent{
constructor (private userService: UserService) { }
showLogin(){
this.userService.registered = true;
}
showRegister(){
this.userService.registered = false;
}
}
home.html
<div class="container">
<div *ngIf="registered">
<login (formUpdate)="handleFormUpdate($event)"></login>
</div>
<div *ngIf="!registered">
<register (formUpdate)="handleFormUpdate($event)"></register>
</div>
</div>
但是什么都没有发生。
项目已在 GitHub 上更新。
【问题讨论】:
-
经验法则。输入和输出在父子交互中起作用。输入用于从父母到孩子的通信。输出用于从子到父的通信。作为旁注;)
-
这里是关于组件交互的信息:angular.io/docs/ts/latest/cookbook/component-communication.html你可能会在那里得到一些想法。
标签: angular