Я занимаюсь с @Input
и @Output
, и вот в чем проблема.Изменение значения в двух разных компонентах одновременно Угловое 2
В моем домашнем компоненте я следующее:
<!-- 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
Войти and
Регистрация and exports them. I import
UserService into
Модуль NavigationBar`.
В 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 {
}
HomeComponent:
@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 там и тогда, что кнопка будет нажата она изменит значение this.registered = this.userService.registered;
в HomeComponent
NavBar.html
<div>
<button (click)="showRegister()">Register</button>
<button (click)="showLogin()">Login</button>
</div>
NavBarComponent:
@Component({
selector:'nav-bar',
templateUrl:'./navigationBar.html',
})
export class NavigationBarComponent{
constructor (private userService: UserService) { }
showLogin(){
this.userService.registered = true;
}
showRegister(){
this.userService.registered = false;
}
}
дома ,html
<div class="container">
<div *ngIf="registered">
<login (formUpdate)="handleFormUpdate($event)"></login>
</div>
<div *ngIf="!registered">
<register (formUpdate)="handleFormUpdate($event)"></register>
</div>
</div>
Однако ничего не происходит.
Проект обновлен на GitHub.
Правила большого пальца. Работа с входными и выходными данными в взаимодействии родителей и детей. В качестве входных данных используется сообщение от родительского дочернего элемента. Выход используется при общении с родительским родителем. Так же, как и боковое оповещение;) – Alex
здесь информация о взаимодействии компонентов: https://angular.io/docs/ts/latest/cookbook/component-communication.html Вы можете получить некоторые идеи там. – Alex