Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何获取子组件angular2中的最新数据_Angular - Fatal编程技术网

如何获取子组件angular2中的最新数据

如何获取子组件angular2中的最新数据,angular,Angular,我需要在子组件中更新数据以进行一些数学运算 我有我的父组件: @Component({ selector: 'car-brand-index', templateUrl: './index.component.html', styleUrls: ['./index.component.scss'], providers: [CarBrandService, Response, SessionService, ServerService, ListTableComponen

我需要在子组件中更新数据以进行一些数学运算

我有我的父组件:

@Component({
  selector: 'car-brand-index',
  templateUrl: './index.component.html',
  styleUrls: ['./index.component.scss'],
  providers: [CarBrandService, Response, SessionService, ServerService,     ListTableComponent, TableAction, Table, TableRow, TableRowField]
})
export class CarBrandIndexComponent implements OnInit {
  table = new Table();

  constructor(private mainService : CarBrandService) {
    this.refresh(this.table.page,this.table.size);
}

 refresh(pageNumber : number, pageSize : number){
   this.mainService.get(pageNumber, pageSize).then(result => {

     this.table.total = result.data.total;
   });
 }
providers: [ListTableService]
我认为:

 <list-table [info]="table" (updateTable)="updateTable($event)"></list-table>
由于视图是在服务调用完成之前完成的,因此密钥总数仍然未定义


我试着用promise做刷新功能,但结果是一样的。是否有一种方法可以在将变量发送给子组件之前等待变量完成,或者子组件知道值何时更新,以便执行数学运算?

如前所述,服务将是最好的方法。您不需要创建新的服务,您可以利用现有的服务,只需添加一些内容。因此,添加子组件将订阅的
主题。我为您设置了一个简化的示例:

服务,这里我使用的是您的
ListTableService

private tableVar = new Subject<number>();

newTable = this.tableVar.asObservable();

tableReceived(table: string) {
  this.tableVar.next(table);
}
在您的孩子中,将
updateFooter
-函数的调用移到
表的订阅中。因此,在您的子构造函数中:

constructor(public listTableService : ListTableService) {
   listTableService.newTable.subscribe(table => {
      this.info = table;
      this.updateFooter();
   })
}

需要注意的一点是,必须删除子组件中的服务提供者:

@Component({
  selector: 'car-brand-index',
  templateUrl: './index.component.html',
  styleUrls: ['./index.component.scss'],
  providers: [CarBrandService, Response, SessionService, ServerService,     ListTableComponent, TableAction, Table, TableRow, TableRowField]
})
export class CarBrandIndexComponent implements OnInit {
  table = new Table();

  constructor(private mainService : CarBrandService) {
    this.refresh(this.table.page,this.table.size);
}

 refresh(pageNumber : number, pageSize : number){
   this.mainService.get(pageNumber, pageSize).then(result => {

     this.table.total = result.data.total;
   });
 }
providers: [ListTableService]
因为如果不这样做,您将得到一个新的服务实例,该实例将不包含父级设置的
值。删除此提供程序时,Angular将按照层次结构查找下一级提供程序,在您的情况下,它将是具有提供程序
ListTableService
的父级,这意味着您的父级和子级将共享相同的服务实例

作为旁注,我建议您不要在组件中声明提供者,如果您不想显式地拥有一个新的服务实例。在
NgModule
中声明提供者更为简洁,更易于维护:)


关于组件交互的更多信息:(+其他可能性)

使用带有已发布可观察事件的服务。组件可以订阅这些事件,并在事件触发时执行数学运算。我认为Flux模式将帮助您:我正在使用一个服务从后端获取所有数据。。。所以你的意思是我需要一个只针对子组件的服务,以便父组件将信息存储在那里?但在我的例子中,数据正在更新,但更新后不会触发updateFooter()函数。所以var amountofPages已经过期了如果没有,我能做的就是在父对象上进行计算,然后发送最终值,这样我在子对象中不需要任何函数,但这不是最好的方法抱歉,这可能不是你想要的答案。我认为它对您的情况可能有用,需要对您的服务进行一些重新工作。您能解释一下基于我的代码的解决方案吗?谢谢
providers: [ListTableService]