基本的には、データのコンポーネントを転送することが基本です。ネストしていないコンポーネント間でデータを転送する
私は、ログインの部分図のためのマスターページ上の1つのangular2コンポーネントを持っている -
<loginpartial></loginpartial>
これが最初子コンポーネントでこのHTMLテンプレートによってレンダリングされる -
<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>
子コンポーネント -
@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;
}
}
これまではこれが意味をなされることを願っています。今すぐユーザーがログインするとすぐに、私はこの部分ビューのユーザー名を親コンポーネントから取得したいと考えています。
親コンポーネント
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 {
}
}
}
あなたはonSubmit
関数が、私は共有からAJAX呼び出しからデータを設定しているhandleResult
を呼び出しています、私のログインフォームの提出であると呼ばれているこの親コンポーネントから見ることができるようにサービス。
これは子コンポーネントにLoginPartialComponent
をリフレッシュさせません。私は@Input()
型パラメータも試しましたが、私を助けませんでした。
更新 -
@Camaronは、私が唯一のイベントエミッタとこのログイン目的のための依存関係を作成した彼の答えに言ったように。しかし、これは機能しません。
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 {
}
}
}
共有サービス(依存)
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 });
}
}
これはうまくいかなかった。
あなたの 'handleResult'関数の中に、' this.item = this.loginComp.item; 'の代わりに' this.loginComp.item = this.item; 'にするべきではありません。 –
@camaron、そうでしょう。しかし、これはそれを変更しません。 – Manoj
両方のコンポーネントからchangeDetection戦略を削除しようとしましたか? –