如何将多个变量从一个组件传递到 angular 9 中的服务?
How can i pass multiple variables from one component to the service in angular 9?
如何将多个变量从一个组件传递到服务并在 angular9 中的另一个组件中获取它?
我很努力地想解决这个问题,但我找不到任何解决办法。
我正在尝试 pass/send 包含来自 sendComponent 的一些数据的变量来服务,并将相同的数据获取到另一个 receiveComponent。单击 send.Html 上的按钮并导航到 receiveComponent.
sent.Html: 我想在按下确定按钮后推送数据 html
<button class="btn btn-primary pull-right" (click)="onPushData()">
<i class="fa fa-check" aria-hidden="true"></i>
OK
</button>
sendComponent: secondTableData,totalPrice 和 totalPrice 这些是包含需要传递给 service.ts 的数据的变量 可能这是错误的做法
onPushData(){
let tData = this.secondTableData // want to push secondTableData variable
let t = this.totalPrice; // want to push totalPrice variable
let d = this.totalPrice // want to push totalQuantity variable
this.dataShareService.onPushTable(tData);
console.log(tData);
this.routerService.navigate(['./billprint'])
}
Service.ts:
@Injectable({
providedIn: 'root'
})
export class DataShareService {
onPushTable(tData) {
--Do something here--
}
}
receiveComponent: 我想获取这个组件中的数据
recDataFromService() {
--do something here--
}
receive.Html: 在此处显示数据
<tr *ngFor="let data of recData;let i = index">
<td>{{i+1}}</td>
<td>{{data.itemName}}</td>
<td>{{data.Quantity}}</td>
<td>{{data.retailRate}}</td>
</tr>
请帮我解决这个问题...如果您对此有任何想法,请分享您的答案..
示例: 这是包含 secondTableData 中的数据数组(itemName、Quantity、retailRate ....)的代码
//To Copy data of First table to Second table
secondTableData = [];
updateSecondTable(data) {
let foundItem = this.secondTableData.find((item) => item.itemName ===
data.itemName);
if (foundItem) {
foundItem.rate = data.retailRate;
foundItem.Quantity += 1;
foundItem.retailRate += data.retailRate;
this.getColumnTotal(); // <----- To call total Price
return;
}
this.secondTableData.push({
itemName: data.itemName,
rate:data.retailRate,
Quantity: 1,
retailRate: data.retailRate,
})
this.getColumnTotal();
}
// to calculate total amount
getColumnTotal() {
const { Quantity, Price } = this.secondTableData.reduce((acc, item) =>
{
acc.Quantity += item.Quantity;
acc.Price += item.retailRate;
return acc;
}, {
Quantity: 0,
Price: 0
});
this.totalQuantity = Quantity;
this.totalPrice = Price;
}
Receive.html: 这是我要在数组中显示数据的代码
我想在接收组件中推送这些变量(secondTableData、totalQuantity、TotalPrice...)并希望以表格形式显示它。
<table class="table table-bordered table-sm">
<thead>
<tr>
<th>SN</th>
<th>Product</th>
<th>Unit</th>
<th>Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let recData of myData;let i = index"> <!--i want to display here -->
<td>{{i+1}}</td>
<td>{{recData.itemName}}</td>
<td>{{recData.Quantity}}</td>
<td>{{recData.retailRate}}</td>
<td></td>
</tr>
<tr class="small" style="height: 10px;">
<td colspan="3" style="border: none;"></td>
<td>Gross Amount:</td>
<td>1100</td>
</tr>
<tr class="small">
<td colspan="3" style="border: none;"></td>
<td>Discount:</td>
<td>100</td>
</tr>
<tr class="small">
<td colspan="3" style="border: none;"></td>
<td>VAT</td>
<td>30</td>
</tr>
<tr class="small">
<td colspan="3" style="border: none;"></td>
<td>Net Amont</td>
<td>1030</td>
</tr>
</tbody>
</table>
您可以创建一个包含您想要的所有内容的传输对象(如果您希望使用一次调用发送所有变量):
const tData = this.secondTableData; variable
const t = this.totalPrice;
const d = this.totalQuantity;
const obj = {tData, t, d};
this.dataShareService.onPushTable(obj);
然后为您服务:
@Injectable({providedIn: 'root'})
export class DataShareService {
private yourData;
onPushTable(obj) {
this.yourData = obj;
}
getYourData() {
return this.yourData;
}
}
在你的组件中:
recDataFromService() {
this.myData = this.dataShareService.getYourData();
}
[根据评论更新]
以上回答完全没有错 => 没有进一步的信息,我认为你只是想把数据弄错 place/moment。为避免此问题,您应该在服务中采用反应式方法:
@Injectable({providedIn: 'root'})
export class DataShareService {
private _yourData$: BehaviorSubject<{tData:any[];t:number;d:number}> =
new BehaviorSubject<{tData:any[];t:number;d:number}>({tData:[],t:0,d:0});
onPushTable(obj) {
this._yourData$.next(obj ? obj : {tData:[],t:0,d:0});
// if you're using ts >= 3.9.x you can use:
// this._yourData$.next(obj??{tData:[],t:0,d:0});
}
getYourData$(): Observable<{tData:any[];t:number;d:number}> {
return this._yourData$.asObservable();
}
}
在接收组件打字稿文件上:
_fromFirstComponent$: Observable<{tData:any[];t:number;d:number}> =
this._dataService.getYourData$();
constructor(private _dataService: DataShareService){}
并且,在您的接收模板中:
...
<tbody>
<tr *ngFor="let recData of (_fromFirstComponent$ | async)?.tData;let i = index"> <!--i want to display here -->
<td>{{i+1}}</td>
<td>{{recData.itemName}}</td>
<td>{{recData.Quantity}}</td>
...
如果您将其服务注入到其他组件中,则存储在您的服务中的任何变量都将在其他组件中可见。
对于您的情况,在 onPushData
上,将您想要的所有内容存储在您的服务中。我不知道你到底想要什么,但会是这样的:
onPushData(){
let tData = this.secondTableData;
let t = this.totalPrice;
let d = this.totalPrice;
this.dataShareService.onPushTable(tData, t, d);
this.routerService.navigate(['./billprint'])
}
确保您的服务收到所有三个变量并将其存储在其中(例如,在您的服务上创建这些变量 tdata、t 和 d 并在 onPushTable
.
上获取它们
因此,在第二个组件构造函数中注入您的服务:
constructor(private myService:MyService)
然后,它将在以下时间可用:
console.log(this.myService.tData);
console.log(this.myService.t);
console.log(this.myService.d);
为您服务:
@Injectable({
providedIn: 'root'
})
export class DataShareService {
private subject = new Subject<any>();
onPushTable(data) {
this.subject.next(data);
}
getData(): Observable<any> {
return this.subject.asObservable();
}
}
在你的sendComponent
中:
this.dataShareService.onPushTable({tData, t, d});
在你的receiveComponent
中:
this.service.getData().subscribe(data => this.data = data);
然后使用 HTML 模板中的 data
字段,例如:
<div>{{data.t}}</div>
<div>{{data.d}}</div>
<tr *ngFor="let rec of data.tData;let i = index">
<td>{{i+1}}</td>
<td>{{rec.itemName}}</td>
<td>{{rec.Quantity}}</td>
<td>{{rec.retailRate}}</td>
</tr>
如何将多个变量从一个组件传递到服务并在 angular9 中的另一个组件中获取它? 我很努力地想解决这个问题,但我找不到任何解决办法。 我正在尝试 pass/send 包含来自 sendComponent 的一些数据的变量来服务,并将相同的数据获取到另一个 receiveComponent。单击 send.Html 上的按钮并导航到 receiveComponent.
sent.Html: 我想在按下确定按钮后推送数据 html
<button class="btn btn-primary pull-right" (click)="onPushData()">
<i class="fa fa-check" aria-hidden="true"></i>
OK
</button>
sendComponent: secondTableData,totalPrice 和 totalPrice 这些是包含需要传递给 service.ts 的数据的变量 可能这是错误的做法
onPushData(){
let tData = this.secondTableData // want to push secondTableData variable
let t = this.totalPrice; // want to push totalPrice variable
let d = this.totalPrice // want to push totalQuantity variable
this.dataShareService.onPushTable(tData);
console.log(tData);
this.routerService.navigate(['./billprint'])
}
Service.ts:
@Injectable({
providedIn: 'root'
})
export class DataShareService {
onPushTable(tData) {
--Do something here--
}
}
receiveComponent: 我想获取这个组件中的数据
recDataFromService() {
--do something here--
}
receive.Html: 在此处显示数据
<tr *ngFor="let data of recData;let i = index">
<td>{{i+1}}</td>
<td>{{data.itemName}}</td>
<td>{{data.Quantity}}</td>
<td>{{data.retailRate}}</td>
</tr>
请帮我解决这个问题...如果您对此有任何想法,请分享您的答案..
示例: 这是包含 secondTableData 中的数据数组(itemName、Quantity、retailRate ....)的代码
//To Copy data of First table to Second table
secondTableData = [];
updateSecondTable(data) {
let foundItem = this.secondTableData.find((item) => item.itemName ===
data.itemName);
if (foundItem) {
foundItem.rate = data.retailRate;
foundItem.Quantity += 1;
foundItem.retailRate += data.retailRate;
this.getColumnTotal(); // <----- To call total Price
return;
}
this.secondTableData.push({
itemName: data.itemName,
rate:data.retailRate,
Quantity: 1,
retailRate: data.retailRate,
})
this.getColumnTotal();
}
// to calculate total amount
getColumnTotal() {
const { Quantity, Price } = this.secondTableData.reduce((acc, item) =>
{
acc.Quantity += item.Quantity;
acc.Price += item.retailRate;
return acc;
}, {
Quantity: 0,
Price: 0
});
this.totalQuantity = Quantity;
this.totalPrice = Price;
}
Receive.html: 这是我要在数组中显示数据的代码
我想在接收组件中推送这些变量(secondTableData、totalQuantity、TotalPrice...)并希望以表格形式显示它。
<table class="table table-bordered table-sm">
<thead>
<tr>
<th>SN</th>
<th>Product</th>
<th>Unit</th>
<th>Price</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<tr *ngFor="let recData of myData;let i = index"> <!--i want to display here -->
<td>{{i+1}}</td>
<td>{{recData.itemName}}</td>
<td>{{recData.Quantity}}</td>
<td>{{recData.retailRate}}</td>
<td></td>
</tr>
<tr class="small" style="height: 10px;">
<td colspan="3" style="border: none;"></td>
<td>Gross Amount:</td>
<td>1100</td>
</tr>
<tr class="small">
<td colspan="3" style="border: none;"></td>
<td>Discount:</td>
<td>100</td>
</tr>
<tr class="small">
<td colspan="3" style="border: none;"></td>
<td>VAT</td>
<td>30</td>
</tr>
<tr class="small">
<td colspan="3" style="border: none;"></td>
<td>Net Amont</td>
<td>1030</td>
</tr>
</tbody>
</table>
您可以创建一个包含您想要的所有内容的传输对象(如果您希望使用一次调用发送所有变量):
const tData = this.secondTableData; variable
const t = this.totalPrice;
const d = this.totalQuantity;
const obj = {tData, t, d};
this.dataShareService.onPushTable(obj);
然后为您服务:
@Injectable({providedIn: 'root'})
export class DataShareService {
private yourData;
onPushTable(obj) {
this.yourData = obj;
}
getYourData() {
return this.yourData;
}
}
在你的组件中:
recDataFromService() {
this.myData = this.dataShareService.getYourData();
}
[根据评论更新]
以上回答完全没有错 => 没有进一步的信息,我认为你只是想把数据弄错 place/moment。为避免此问题,您应该在服务中采用反应式方法:
@Injectable({providedIn: 'root'})
export class DataShareService {
private _yourData$: BehaviorSubject<{tData:any[];t:number;d:number}> =
new BehaviorSubject<{tData:any[];t:number;d:number}>({tData:[],t:0,d:0});
onPushTable(obj) {
this._yourData$.next(obj ? obj : {tData:[],t:0,d:0});
// if you're using ts >= 3.9.x you can use:
// this._yourData$.next(obj??{tData:[],t:0,d:0});
}
getYourData$(): Observable<{tData:any[];t:number;d:number}> {
return this._yourData$.asObservable();
}
}
在接收组件打字稿文件上:
_fromFirstComponent$: Observable<{tData:any[];t:number;d:number}> =
this._dataService.getYourData$();
constructor(private _dataService: DataShareService){}
并且,在您的接收模板中:
...
<tbody>
<tr *ngFor="let recData of (_fromFirstComponent$ | async)?.tData;let i = index"> <!--i want to display here -->
<td>{{i+1}}</td>
<td>{{recData.itemName}}</td>
<td>{{recData.Quantity}}</td>
...
如果您将其服务注入到其他组件中,则存储在您的服务中的任何变量都将在其他组件中可见。
对于您的情况,在 onPushData
上,将您想要的所有内容存储在您的服务中。我不知道你到底想要什么,但会是这样的:
onPushData(){
let tData = this.secondTableData;
let t = this.totalPrice;
let d = this.totalPrice;
this.dataShareService.onPushTable(tData, t, d);
this.routerService.navigate(['./billprint'])
}
确保您的服务收到所有三个变量并将其存储在其中(例如,在您的服务上创建这些变量 tdata、t 和 d 并在 onPushTable
.
因此,在第二个组件构造函数中注入您的服务:
constructor(private myService:MyService)
然后,它将在以下时间可用:
console.log(this.myService.tData);
console.log(this.myService.t);
console.log(this.myService.d);
为您服务:
@Injectable({
providedIn: 'root'
})
export class DataShareService {
private subject = new Subject<any>();
onPushTable(data) {
this.subject.next(data);
}
getData(): Observable<any> {
return this.subject.asObservable();
}
}
在你的sendComponent
中:
this.dataShareService.onPushTable({tData, t, d});
在你的receiveComponent
中:
this.service.getData().subscribe(data => this.data = data);
然后使用 HTML 模板中的 data
字段,例如:
<div>{{data.t}}</div>
<div>{{data.d}}</div>
<tr *ngFor="let rec of data.tData;let i = index">
<td>{{i+1}}</td>
<td>{{rec.itemName}}</td>
<td>{{rec.Quantity}}</td>
<td>{{rec.retailRate}}</td>
</tr>