recargar pasar parametros otro enviar entre datos comunicacion componentes componente angularjs angular typescript angularjs-directive angularjs-scope

angularjs - otro - pasar parametros entre componentes angular 4



Transferencia de datos entre componentes no anidados (2)

Básicamente, lo que deseo es transferir componentes b / n de datos.

Tengo un componente angular2 en la página maestra para una vista parcial de inicio de sesión -

<loginpartial></loginpartial>

Esto se procesa inicialmente a través de esta plantilla html con componente secundario -

<ul [hidden]="!item.isAuthenticated"> <li><a href="javascript:;">Hello! {{item.userName}}</a></li> <li><a href="javascript:;">LogOff</a></li> </ul> <ul [hidden]="item.isAuthenticated"> <li><a href="javascript:;">Hello! User</a></li> <li><a href="javascript:;">Log In</a></li> </ul>

Componente hijo -

@Component({ selector: ''loginpartial'', templateUrl: ''../Templates/LoginPartial.html'' }) export class LoginPartialComponent implements OnInit { public item: any = { isAuthenticated: false, userName: '' '' } constructor() { this.item.isAuthenticated = false; } ngOnInit() { this.item.isAuthenticated = false; } }

Espero que esto tenga sentido hasta ahora. Ahora lo que necesito es tan pronto como el usuario inicie sesión, quiero obtener un nombre de usuario en esta vista parcial transferida desde el componente principal.

Componente principal

import { Component, ChangeDetectionStrategy, OnInit} from ''@angular/core''; import {LoginPartialComponent} from ''../loginpartialview/loginpartial.component.ts''; import {SharedService} from ''../sharedService/app.sharedService.ts''; @Component({ selector: ''loginmodel'', templateUrl: ''../Templates/Login.html'', changeDetection: ChangeDetectionStrategy.OnPush, providers: [LoginPartialComponent,SharedService] }) export class LoginComponent implements OnInit { item: any = { isAuthenticated: false, userName: '' '' }; constructor(private sharedService: SharedService, private loginComp: LoginPartialComponent) { } onSubmit(item: any): void { if (this.myForm.valid) { var userObject = { email: item.email, password: item.password }; this.sharedService.getLogin(userObject).map(response => response.json()) .subscribe( data => this.handleResult(data), error => console.log(error) ); } } private handleResult(data) { if (data.success) { this.item.isAuthenticated = true; this.item.userName = data.userName; this.item = this.loginComp.item; } else { } } }

Como se puede ver en este componente principal cuando se onSubmit función de onSubmit , que es mi envío de formulario de inicio de sesión, estoy llamando a handleResult que está configurando datos desde una llamada ajax desde el servicio compartido.

Esto no permite que el componente secundario - LoginPartialComponent actualice. Intenté con los parámetros de tipo @Input() también pero no me ayudaron.

Actualización -

Como dijo @Camaron en su respuesta, creé una dependencia para este propósito de inicio de sesión solo con emisores de eventos. Pero esto no funciona.

LoginPartialComponent

import { Component, OnInit} from ''@angular/core''; import {LoginPartialModel} from ''../loginpartialview/loginpartial.model.ts''; import {SharedService} from ''../sharedService/app.sharedService.ts''; import ''rxjs/add/operator/map''; import ''rxjs/add/operator/catch''; @Component({ selector: ''loginpartial'', templateUrl: ''../Templates/LoginPartial.html'', providers: [SharedService] }) export class LoginPartialComponent { item: LoginPartialModel = new LoginPartialModel(); constructor(private service: SharedService) { this.service.onLoginSuccess.subscribe((loginData: any) => this.item == loginData.item); } }

LoginComponent

import { Component, OnInit} from ''@angular/core''; import {SharedService} from ''../sharedService/app.sharedService.ts''; @Component({ selector: ''loginmodel'', templateUrl: ''../Templates/Login.html'', providers: [SharedService] }) export class LoginComponent { constructor(private sharedService: SharedService) { } onSubmit(item: any): void { var userObject = { email: item.email, password: item.password }; this.sharedService.getLogin(userObject).map(response => response.json()) .subscribe( data => this.handleResult(data), error => console.log(error) ); } private handleResult(data) { if (data.success) { this.close(); this.sharedService.onLoginSuccess.emit(data); } else { } } }

Servicio compartido (dependencia)

import { Component, Injectable, EventEmitter} from ''@angular/core''; @Injectable() export class SharedService { onLoginSuccess: EventEmitter<any> = new EventEmitter<any>(); constructor() { } notifyLoginSuccess(item: any): void { this.onLoginSuccess.emit({ item: item }); } }

Esto no funcionó.


Creo que la forma preferida de fanático angular sería hacer una función en un componente (o servicio, supongo, aunque supongo que ahora solo se trata de componentes). Observable y suscríbase.

Creo que esta publicación lo explica bien:

http://mean.expert/2016/05/21/angular-2-component-communication/

También tenga en cuenta las propiedades de entrada y salida para comunicación padre -> hijo y viceversa.


Intente usar un servicio para establecer esta comunicación, subscribe al LoginPartialComponent .

@Injectable() export class LoginService { onLoginSuccess: EventEmitter<any>() = new EventEmitter<any>(); constructor() { } notifyLoginSuccess(item:any):void { this.onLoginSuccess.emit({item: item}); } }

Y luego Inyecte este servicio en ambos componentes. En su LoginPartialComponent suscríbase a este evento de servicio.

constructor(public loginService:LoginService) { this.loginService.onLoginSuccess.subscribe((loginData: any) => this.item = loginData.item); }

Luego, en su función handleResult realice una llamada a loginService.notifyLoginSuccess y envíe el item .

Con esta solución puede eliminar la dependencia de sus componentes para que LoginComponent no necesite saber que hay un LoginPartialComponent .