オブジェクトの2つの配列を持つクラスを宣言しました。配列は、バックエンドからの情報で埋められます。 ObservableとHttpを使ってバックエンドから情報を取得しています。グローバルクラスは、module.tsファイルのプロバイダ配列内で宣言されているため、最も高い点で宣言されています。一番上のコンポーネントの1つでは、ngOnInitメソッドの配列を満たすサービスを購読しています。コンポーネントのコンストラクタに挿入されたデータ配列サービスクラス。私は、このクラスの正しい情報が配列に取り込まれていることがわかります。しかし、子コンポーネントに同じサービスクラスを注入すると、すべての配列がnullになります。どうして?更新された値を保持する方法はありますか?助けてください。ここでグローバル変数は、角度2のあるコンポーネントから別のコンポーネントに更新された値を保持しません
私のコードは次のとおりです。
グローバルクラスAdminProductDisplayInfo(このクラスはapp.module.tsファイルにプロバイダ配列に追加され
//管理 - 製品 - ディスプレイ - info.ts
import { ComponentGroupDisplayInfo } from './component-group-display';
import { ServiceCatDisplayInfo } from './service-cat-display-info';
export class AdminProudctDisplayInfo {
public cgc_info_list: ComponentGroupDisplayInfo[] = [];
public service_cat_info_list: ServiceCatDisplayInfo[] = []
}
//サービスは、バックエンドからデータを取得する
import { AdminProudctDisplayInfo } from '../models/admin-product-display-info';
@Injectable()
export class BagProductService {
private backendURL = 'http://localhost:8080/BAG';
constructor (private http: Http) {}
/* This method gets the data necessary to display from backend */
getAdminProductDisplayInfo(): Observable<AdminProudctDisplayInfo> {
let adminURL = this.backendURL.concat('/admin/getAdminProudctDisplayInfo');
let body = JSON.stringify("");
let headers = new Headers({'Content-type': 'application/json'});
let options = new RequestOptions({headers: headers});
return this.http.post(adminURL, body, options)
.map(this.extractData)
.catch(this.handleError);
}
}
BagProductServiceとAdminProductDisplayInfoがサブスクライブし、データにデータを表示するために使用される上記部品の
import { BagProductService } from '../services/adminBagProduct.service';
import { ServiceCatDisplayInfo } from '../models/service-cat-display-info';
@Component({
selector: 'admin-add-bag-Product',
templateUrl: './admin-add-bag-product.html'
})
export class AdminAddBagProduct implements OnInit {
constructor(private router: Router,
private bagProdService: BagProductService,
private adminProdDispInfo: AdminProudctDisplayInfo) {}
ngOnInit() {
this.bagProdService.getAdminProductDisplayInfo().subscribe(
data => {this.adminProdDispInfo = data; console.log("data received: ", data)},
error => {this.errorMessage = <any>error, console.log("Error Message: ", this.errorMessage)});
}
//Here I see data being populated from backend and everything looks good.
}
//子コンポーネントを取得するために使用されますが、すべてがNULLであるから//コンポーネントここに。
import { BagProductService } from '../services/adminBagProduct.service';
@Component({
selector: 'admin-add-bag-component',
templateUrl: './admin-add-bag-component.html'
})
export class AdminAddBagComponent {
constructor(private router: Router, private bagProdService: BagProductService, private adminProdDispInfo: AdminProudctDisplayInfo) {
console.log("in Component display: ", this.adminProdDispInfo.cgc_info_list);
// Here this.adminProdDispInfo.cgc_info_list and other array is null.
}
}
ご回答いただきありがとうございます。私はプロパティのバインド方法を知っていますが、AdminProductDisplayクラスの情報は多くのコンポーネントで共有されるため、サービスの方法について考えました。 Observerを使用すると、AdminProductDisplayオブジェクトのローカルコピーが作成され、メインオブジェクトが更新されないということがわかります。グローバルなAdminProductDispalyオブジェクトを作成する方法があるかどうかを知りたいと思っています。一部のコンポーネントはそれを更新でき、変更されたコンポーネントは他のコンポーネントで使用できます。 – Jpatel
おそらくこれは? http://stackoverflow.com/a/41451504/6294072これはサービスにデータを格納し、各コンポーネントは1つのデータとデータをバインドするので、それがあなたが望むならば? :) – Alex
私の場合、AdminAddBagProductはObservableを購読していますが、データはグローバルコピーではなくAdminProductDisplayのローカルコピーに保存されています。他のコンポーネントにデータが必要な場合はObservableに再度購読する必要があり、その場合、サービスはバックエンドに対して別の呼び出しを行いデータを受信しますが、これはパフォーマンスが良いわけではありません。私は、バックエンドから一度データを取得し、アプリケーションのライフサイクルを通して使用する方法があるのだろうかと思っています。 – Jpatel