angular - Angular/Aggrid:如何在单独的组件中使用组件功能(无关系)
问题描述
我正在使用网格 api,ag-grid。要将数据发送到网格,需要rowData
在组件类中创建一个名为的变量。在这TableComponent
方面,我有一个功能refreshData
。此函数使用服务从服务器获取数据,然后将其显示到网格:
export class TableComponent implements OnInit {
private rowData: any;
private columnDefs;
constructor(
private service: Service,
private http: HttpClient,
vcr: ViewContainerRef,
public dialog: MatDialog,
private fb: FormBuilder
) {
this.columnDefs = [{
headerName: 'id',
field: 'id',
hide: true
},
{
headerName: 'First Name',
field: 'firstName'
}
];
}
ngOnInit() {
this.refreshData();
}
refreshData() {
this.service.getData('http://localhost:3000/employees')
.subscribe(data => {
this.rowData = data;
})
}
}
我有一个单独的组件来创建一个表单。当我单击 中的按钮时TableComponent
,会弹出表单。从这里,用户可以单击保存按钮将他们的数据保存到网格中。这是服务和组件:
服务
getData(url: string): Observable < any > {
return this.http.get(url).pipe(
map(this.extractData),
catchError(this.handleErrorObservable));
}
private extractData(res: Response) {
let body = res;
console.log(res)
return body || {};
}
saveUser(employee: Employees) {
return this.http.post(this._url, employee, httpOptions).subscribe((res: any) => {
res = employee
this.getData('http://localhost:3000/employees')
})
}
组件保存
employeeInfo: Employees; //my model
onSave() {
this.employeeInfo = this.frmUser.getRawValue();
this.service.saveUser(this.employeeInfo);
//Here I would somehow refresh the data
this.dialogRef.close({
success: 'success'
});
}
现在我刷新表格的方法是在TableComponent
课堂上使用间隔函数。这只是每隔几秒钟执行一次函数refresData
来获取数据并更新表。但这不是一个好习惯,因为我的应用程序会在不需要时不断地发出 http 请求。
问题:如何在FormComponent
课堂上使用 refreshData 函数?我希望rowData
每次单击保存按钮时都更新变量。这可能EventEmitters
吗?该表格与 my 完全分开TableComponent
,所以我认为这是可能的。谢谢你。
好吧,我想通了!**服务: **
private componentMethodCallSource = new Subject<any>();
componentMethodCalled$ = this.componentMethodCallSource.asObservable();
saveUser(employee: Employees) {
return this.http.post(this._url, employee, httpOptions).subscribe((res: any) => {
res = employee
this.componentMethodCallSource.next();
})
}
表格组件
constructor() {
this.service.componentMethodCalled$.subscribe(
() => {
this.refreshData()
}
)
}
我创建了 observable,在构造函数中订阅了一个,并将 this.refreshData 应用到它。然后感谢我的服务,我可以在我的 saveData 服务中调用 observable。然后,我只需在表单类中调用 saveData 服务。
解决方案
在您的服务中创建Subject
/ 。BehaviorSubject
在extractData
您的服务中的方法内,调用您刚刚声明next
的 this Subject
/上的方法。BehaviorSubject
然后在你TableComponent
刚刚订阅这个Subject
/ BehaviorSubject
。每次发生更改时,您都会获得更新的值。
所以这就是我的意思:
employees: BehaviorSubject<any> = new BehaviorSubject<any>(null);
getData(url: string): Observable < any > {
return this.http.get(url).pipe(
map(this.extractData),
catchError(this.handleErrorObservable));
}
private extractData(res: Response) {
let body = res;
console.log(res)
// Assuming that body here has an array of Employee Objects.
employees.next(body);
return body || {};
}
saveUser(employee: Employees) {
return this.http.post(this._url, employee, httpOptions).subscribe((res: any) => {
res = employee
this.getData('http://localhost:3000/employees')
})
}
现在在您的TableComponent
而不是调用Service
'sgetData
方法中,只需subscribe
像service.employees
这样调用:
export class TableComponent implements OnInit {
private rowData: any;
private columnDefs;
constructor(
private service: Service,
private http: HttpClient,
vcr: ViewContainerRef,
public dialog: MatDialog,
private fb: FormBuilder
) {
this.columnDefs = [{
headerName: 'id',
field: 'id',
hide: true
},
{
headerName: 'First Name',
field: 'firstName'
}
];
}
ngOnInit() {
this.service.employees.subscribe(employees => this.rowData = employees);
this.service.getData();
}
}
推荐阅读
- java - ModelAndView 返回方法对象
- mongodb - 云数据存储作为 mongodb 的替代品
- wso2 - 如何配置 WSO2 API Manager 2.1.0 以使用 Identity Server 5.3.0
- java - Spark结构化流:当前批次落后
- javascript - 预选状态下拉框时出现 JS 错误
- javascript - 在 Angular 7 中使用外部 JavaScript 文件
- r - 从 glmmTMB 类的 ZINB 模型生成预测计数分布
- google-sheets - 表格:to_date 公式从时间戳获取日期
- c++ - 用户定义转换为模板类引用的编译器行为不一致
- python - CharField 的不支持查找“iexect”或不允许在字段上加入