【问题标题】:Refactoring rest request in SPFx Web aprt在 SPFx Web 部件中重构休息请求
【发布时间】:2019-08-26 04:00:40
【问题描述】:

我曾在一个 Web 部件中工作,该部件从 SP 列表中获取项目,然后对这些结果进行过滤或分组。 对于每个过滤器操作,我使用 Rest 向 SP 发送一个新请求,并且我正在使用 rest 代码取回过滤后的项目并在 Web 部件中显示它们。 现在我有两个由 onClick 事件触发的过滤器操作。

每个动作如下所示: 按封闭协议过滤:

private getEnded(): void {
this.props.provider.getEnded().then((originalitems: IList[]) => {

  this.setState({
    filteredListItems: originalitems,
    filter: true
  });
});

}

并在过去的最后一天过滤:

 private getPassed(): void {
this.props.provider.getPassed().then((originalitems: IList[]) => {
  this.setState({
    filteredListItems: originalitems,
    filter: true
  });
});

}

在dataprovider文件中我有这些方法,每个都向SharePoint发出请求,唯一的区别是filter参数:

要获得封闭的协议(从方法 getEnded() 调用):

public async getEnded(): Promise<IList[]> {
let today = new Date();
let Agreements: IList[] = [];

const items = await sp.web.lists
  .getByTitle("AgreementDatabase")
  .items.select(this.select)
  .filter(
    `(AgreementEnded eq true) and (AgreementEndDate le '${today.toISOString()}')`
  )
  .expand("SalesManager,TaxCatchAll,FrameworkAgreement")
  .get();

items.forEach(item => {
  Agreements.push({
    Title: item.Title,
    Id: item.Id,
    CustomerAgreementNr: item.CustomerAgreementNr,
    AgreementType: item.AgreementType,
    Customer: item.TaxCatchAll[0].Term,
    FrameworkAgreement: item.FrameworkAgreement.Title,
    ContactPerson: item.ContactPerson,
    SalesManager: item.SalesManager.FirstName + " " + item.SalesManager.LastName,
    DeliveryType: item.DeliveryType,
    AgreementStartDate: item.AgreementStartDate,
    AgreementEndDate: item.AgreementEndDate,
    AgreementEnded: item.AgreementEnded,
    LastPriceAdjustment: item.LastPriceAdjustment,
    NextPriceAdjustment: item.NexPriceAdjustment,
  });
});

return new Promise<IList[]>(async resolve => {
  resolve(Agreements);
});

}

并获得通过的协议(从方法 getPassed() 调用):

public async getPassed(): Promise<IList[]> {
let today = new Date();
let Agreements: IList[] = [];


const items = await sp.web.lists
  .getByTitle("AgreementDatabase")
  .items.select(this.select)
  .filter(`LastPriceAdjustment le '${today.toISOString()}'`)
  .expand("SalesManager,TaxCatchAll,FrameworkAgreement")
  .get();

items.forEach(item => {
  Agreements.push({
    Title: item.Title,
    Id: item.Id,
    CustomerAgreementNr: item.CustomerAgreementNr,
    AgreementType: item.AgreementType,
    Customer: item.TaxCatchAll[0].Term,
    FrameworkAgreement: item.FrameworkAgreement.Title,
    ContactPerson: item.ContactPerson,
    SalesManager: item.SalesManager.FirstName + " " + item.SalesManager.LastName,
    DeliveryType: item.DeliveryType,
    AgreementStartDate: item.AgreementStartDate,
    AgreementEndDate: item.AgreementEndDate,
    AgreementEnded: item.AgreementEnded,
    LastPriceAdjustment: item.LastPriceAdjustment,
    NextPriceAdjustment: item.NexPriceAdjustment,
  });
});

return new Promise<IList[]>(async resolve => {
  resolve(Agreements);
});

}

如您所见,从SP请求信息的方法几乎相同,唯一的区别是过滤器参数。 我想知道如何仅重用其中一种休息方法来从共享点获取和过滤数据?

最好的问候 美国

【问题讨论】:

    标签: rest spfx


    【解决方案1】:

    您可以编写一种方法并通过文件管理器:

    private getEnded(): void {
    const filter = `(AgreementEnded eq true) and (AgreementEndDate le '${today.toISOString()}')`;
    this.props.provider.getAgreements(filter).then((originalitems: IList[]) => {
    
      this.setState({
        filteredListItems: originalitems,
        filter: true
      });
    });
    
    
    
     private getPassed(): void {
    const filter = `LastPriceAdjustment le '${today.toISOString()}'`;
        this.props.provider.getAgreements(filter).then((originalitems: IList[]) => {
          this.setState({
            filteredListItems: originalitems,
            filter: true
          });
        });
    
    public async getAgreements(filterAgreements: string): Promise<IList[]> {
    let today = new Date();
    let Agreements: IList[] = [];
    
    const items = await sp.web.lists
      .getByTitle("AgreementDatabase")
      .items.select(this.select)
      .filter(filterAgreements)
      .expand("SalesManager,TaxCatchAll,FrameworkAgreement")
      .get();
    
    items.forEach(item => {
      Agreements.push({
        Title: item.Title,
        Id: item.Id,
        CustomerAgreementNr: item.CustomerAgreementNr,
        AgreementType: item.AgreementType,
        Customer: item.TaxCatchAll[0].Term,
        FrameworkAgreement: item.FrameworkAgreement.Title,
        ContactPerson: item.ContactPerson,
        SalesManager: item.SalesManager.FirstName + " " + item.SalesManager.LastName,
        DeliveryType: item.DeliveryType,
        AgreementStartDate: item.AgreementStartDate,
        AgreementEndDate: item.AgreementEndDate,
        AgreementEnded: item.AgreementEnded,
        LastPriceAdjustment: item.LastPriceAdjustment,
        NextPriceAdjustment: item.NexPriceAdjustment,
      });
    });
    
    return new Promise<IList[]>(async resolve => {
      resolve(Agreements);
    });
    

    其他改进:

    您可以使用 .map() 代替 .foreach()

    Agreements = items.map(item => {
        Title: item.Title,
        Id: item.Id,
        CustomerAgreementNr: item.CustomerAgreementNr,
        AgreementType: item.AgreementType,
        Customer: item.TaxCatchAll[0].Term,
        FrameworkAgreement: item.FrameworkAgreement.Title,
        ContactPerson: item.ContactPerson,
        SalesManager: item.SalesManager.FirstName + " " + item.SalesManager.LastName,
        DeliveryType: item.DeliveryType,
        AgreementStartDate: item.AgreementStartDate,
        AgreementEndDate: item.AgreementEndDate,
        AgreementEnded: item.AgreementEnded,
        LastPriceAdjustment: item.LastPriceAdjustment,
        NextPriceAdjustment: item.NexPriceAdjustment,
    });
    

    【讨论】:

      猜你喜欢
      • 2021-04-14
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 2018-05-14
      • 2019-06-16
      • 2020-07-13
      • 2016-07-14
      • 1970-01-01
      相关资源
      最近更新 更多