gpt4 book ai didi

javascript - Angular 4 在两个不相关的组件之间传递数据

转载 作者:太空狗 更新时间:2023-10-29 16:49:52 25 4
gpt4 key购买 nike

我对在 Angular 中传递数据有疑问。

首先,我没有 <parent><child [data]=parent.data></child></parent> 这样的结构

我的结构是

<container>
<navbar>
<summary></summary>
<child-summary><child-summary>
</navbar>
<content></content>
</container>

所以,在 <summary />我有一个选择将值发送到 <child-summary /><content /> .

OnSelect 方法在 <summary /> 内用 (change) 很好地触发了组件。

所以,我尝试使用 @Input , @Output@EventEmitter指令,但我看不到如何将事件检索为组件的@Input,除非继续父/子模式。我创建的所有示例都与组件之间存在关系。

编辑:BehaviorSubject 不工作的示例(所有连接到 API 的服务都运行良好,只有 observable 在开始时触发,但在 select 值更改时不触发)

shared service = company.service.ts(用于检索公司数据)

import { Injectable } from '@angular/core';
import { Headers, Http, Response } from '@angular/http';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/toPromise';

@Injectable()
export class SrvCompany {

private accountsNumber = new BehaviorSubject<string[]>([]);
currentAccountsNumber = this.accountsNumber.asObservable();

changeMessage(accountsNumber: string[]) {
this.accountsNumber.next(accountsNumber);
}

private _companyUrl = 'api/tiers/';

constructor(private http: Http) { }

getSociete(): Promise<Response> {
let url = this._companyUrl;
return this.http.get(url).toPromise();
}
}

invoice.component.ts(“ child ”)

import { Component, OnInit, Input } from '@angular/core';
import { Headers, Http, Response } from '@angular/http';

import { SrvInvoice } from './invoice.service';
import { SrvCompany } from '../company/company.service';

@Component({
selector: 'invoice',
templateUrl: 'tsScripts/invoice/invoice.html',
providers: [SrvInvoice, SrvCompany]
})

export class InvoiceComponent implements OnInit {

invoice: any;

constructor(private srvInvoice: SrvInvoice, private srvCompany: SrvCompany)
{

}

ngOnInit(): void {
//this.getInvoice("F001");

// Invoice data is linked to accounts number from company.
this.srvCompany.currentAccountsNumber.subscribe(accountsNumber => {
console.log(accountsNumber);
if (accountsNumber.length > 0) {
this.srvInvoice.getInvoice(accountsNumber).then(data => this.invoice = data.json());
}
});
}

//getInvoice(id: any) {
// this.srvInvoice.getInvoice(id).then(data => this.invoice = data.json());
//}
}

company.component.ts(触发“父级”)

import { Component, Inject, OnInit, Input } from '@angular/core';
import { Headers, Http, Response } from '@angular/http';

import { SrvCompany } from './company.service';

@Component({
selector: 'company',
templateUrl: 'tsScripts/company/company.html',
providers: [SrvCompany]
})

export class CompanyComponent implements OnInit {

societes: any[];
soc: Response[]; // debug purpose
selectedSociete: any;

ville: any;
ref: any;
cp: any;
accountNumber: any[];

constructor(private srvSociete: SrvCompany)
{

}

ngOnInit(): void {
this.getSocietes();
}

getSocietes(): void {

this.srvSociete.getSociete()
.then(data => this.societes = data.json())
.then(data => this.selectItem(this.societes[0].Id));
}

selectItem(value: any) {
this.selectedSociete = this.societes.filter((item: any) => item.Id === value)[0];
this.cp = this.selectedSociete.CodePostal;
this.ville = this.selectedSociete.Ville;
this.ref = this.selectedSociete.Id;
this.accountNumber = this.selectedSociete.Accounts;
console.log(this.accountNumber);
this.srvSociete.changeMessage(this.accountNumber);
}
}

最佳答案

在这种情况下,您想要使用共享服务,因为您的组件被构造为兄弟和孙子。这是我制作的关于 sharing data between components 的视频示例解决了这个确切的问题。

首先在服务中创建一个 BehaviorSubject

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
@Injectable()
export class DataService {

private messageSource = new BehaviorSubject("default message");
currentMessage = this.messageSource.asObservable();

constructor() { }

changeMessage(message: string) {
this.messageSource.next(message)
}

}

然后将此服务注入(inject)每个组件并订阅可观察对象。

import { Component, OnInit } from '@angular/core';
import { DataService } from "../data.service";
@Component({
selector: 'app-parent',
template: `
{{message}}
`,
styleUrls: ['./sibling.component.css']
})
export class ParentComponent implements OnInit {

message:string;

constructor(private data: DataService) { }

ngOnInit() {
this.data.currentMessage.subscribe(message => this.message = message)
}

}

您可以更改任一组件的值,即使您没有父/子关系,该值也会更新。

import { Component, OnInit } from '@angular/core';
import { DataService } from "../data.service";
@Component({
selector: 'app-sibling',
template: `
{{message}}
<button (click)="newMessage()">New Message</button>
`,
styleUrls: ['./sibling.component.css']
})
export class SiblingComponent implements OnInit {

message:string;

constructor(private data: DataService) { }

ngOnInit() {
this.data.currentMessage.subscribe(message => this.message = message)
}

newMessage() {
this.data.changeMessage("Hello from Sibling")
}

}

关于javascript - Angular 4 在两个不相关的组件之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44414226/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com