【问题标题】:Work with async services (observers) in angular2在 angular2 中使用异步服务(观察者)
【发布时间】:2018-03-05 09:29:22
【问题描述】:

Angular2\ES6: 我正在尝试构建一个页面(模型),其中包含一组过滤器,这些过滤器应该从服务(异步)获取数据 - 每个过滤器调用一次。 该模型包含 2 个主要类:ReportReportFilterReport 可以包含多个 reportFilters(过滤器:ReportFilter[] = [];),并且每个 reposrtFilter 都由服务填充。 我已经尝试使用 observbles 进行所有异步操作,但最终结果是过滤器中仍然没有数据(服务可靠并返回数据),在构造主 Report 类实例时(这应该是起点) . 任何支持将不胜感激! 查看我的代码: 这是报告类:

export class CadasterReport
{
    filters : CadasterReportFilter[] = [];
    filtersIDs : number[] = [];
    activeReportFilter : CadasterReportFilter = null;
    constructor(  private filterService : FilterService,  private id : number )
    {
        this.filtersIDs =  this.getFiltersByReport();
        this.populateFilters().forEach(observable => 
        {
            observable.subscribe(result => this.concatData(result));
        });

    } 

    addToFilters(id : number, filters : CadasterReportFilter[]) : Observable<any>
    {
         this.activeReportFilter = 
         new CadasterReportFilter(this.filterService, id);

         return this.activeReportFilter.InitData();
    }

    concatData( result : any)
    {
        this.activeReportFilter.parseData(result[0]);
        this.filters.concat(this.activeReportFilter);//Here I except to see
        //that the this.activeReportFilter is already populated with the 
        //filter's data - it isn't
    }
    getFiltersByReport() : number[]
    {
        let filtersNumbers : number [] = null;
        switch (this.id.toString())
        {
            case ("10"):
                filtersNumbers = [10,20,30];
                break;
            case ("20"):
                filtersNumbers = [20,30,10];
                break;
            default:
               filtersNumbers = [30,10,20];
               break;
        }
        return filtersNumbers;
    }

    populateFilters() : Observable<any>[]
    {
        var filterObservablesCollection : Observable<any>[] = [];

       this.filtersIDs.forEach(filterID => 
       {
            filterObservablesCollection.push(this.addToFilters(filterID, 
             this.filters));
        });
        return filterObservablesCollection;
    }
}

这是报告过滤器:

export class ReportFilter
{
    private filterValues : string[] = [];
    private selectedValue : string = null;
    get ID() : number
    {
        return this.id;
    }
    set ID(value : number)
    {
        this.id = value;
    }
    private name : string = null;
    get Name() : string
    {
        return this.name;
    }
    set Name(value : string)
    {
        this.name = value;
    }
    public constructor(private filterService : FilterService,  private id : number ){}

    public InitData() : Observable<any>
    {
        return this.initFilter();
    }
    private initFilter() : Observable<any>
    {
        this.filterService.FilterID = this.ID;
        return this.filterService.GetFilterValues();
    }

    public parseData(result : any)
    {
        this.name = result.Name;
        this.filterValues = result.values;
    }

}

这是我从组件中的初始调用:

@Component({
  selector: 'app-report',
  templateUrl: './report.component.html',
  styleUrls: ['./report.component.css']
})
export class ReportComponent implements OnInit {

  private reportID : number;
  constructor(private activatedRoute: ActivatedRoute,   private filterService : FilterService) { }

  ngOnInit() {
    this.activatedRoute.queryParams.subscribe(( params: ParamMap) => this.initReport(params));
  }

  initReport(params : ParamMap): any 
  {
    this.reportID = params['id'];
    var Report : Report = new Report(this.filterService, this.reportID); 
  }
}

【问题讨论】:

  • 你是在 ngOnChange() 中调用那些服务吗?
  • 不,我是从组件中非常基本的 ngOnInit 调用它们(我已经添加了相关的组件代码)
  • 将该服务放在 ngOnChange() 中,当您进行异步调用时,在您返回结果之前页面已经加载,因此如果您将其放在 ngOnChange 中,它会在您返回时自动填充详细信息结果。
  • @Abhishek Ekaanth - 这不是问题 - 请参阅我在 Report 类的 concatData 函数中的备注:this.filters.concat(this.activeReportFilter);//这里我除了看到 // this.activeReportFilter 已经填充了 //filter 的数据 - 它不是

标签: angular ecmascript-6 angular-observable


【解决方案1】:

除了将结果作为数组而不是对象接收的 parseData 函数之外,一切都很顺利。 我修复了代码: this.activeReportFilter.parseData(result); 应该 this.activeReportFilter.parseData(result[0]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    相关资源
    最近更新 更多