【问题标题】:How to query list items and attachments from a list using @PnP/SP?如何使用@PnP/SP 从列表中查询列表项和附件?
【发布时间】:2018-08-01 20:33:09
【问题描述】:

我正在使用 PNP SP 来查询列表项及其附件。如何编写当前函数的正确且简化的版本?

下面的函数有效,我从第一个查询中得到结果,它检索 ID、TITLE、LINK。但是我没有从第二个查询 Title、Link.URL、FileName、ServerRelativeUR 中得到任何结果——但是当我调试代码时,我可以看到第二个查询正在执行并返回值,但函数在完成第二个查询之前就离开了。如何让这个函数正确地查询这两个东西并将它们返回给调用者?

private GetCompleteData() : Promise<any>
{
    let result : string = "";

    return sp.web.lists.getByTitle('LIST').items.select('Id, Title, Link').get().then( response => {
      response.forEach( item => {
        let attachments = sp.web.lists.getByTitle('LIST').items.getById(item.Id);        

        attachments.attachmentFiles.select('FileName, ServerRelativeUrl').get().then( responseAttachments => {
          responseAttachments.forEach( attachmentItem => {
            result += item.Title                       + "<br/>" +
                      item.Link.Url                    + "<br/>" + 
                      attachmentItem.FileName          + "<br/>" + 
                      attachmentItem.ServerRelativeUrl + "<br/><br/>";
          });
        });
      });

      return result;
    });
}

【问题讨论】:

    标签: typescript sharepoint-online spfx


    【解决方案1】:

    您可以使用expand 属性来获取第一个 REST 调用本身中的数据,而不是对每个列表项进行 REST 调用。

    您可以通过以下示例代码对其进行修改:

    sp.web.lists.getByTitle("LIST").items.select("Title", "ID", "Links" "AttachmentFiles").
    expand("AttachmentFiles").get().then((response) => {
          console.log(response);
    });
    

    您可以根据需要进行修改。这将为您提供列表项的附件数组,如下所示:

    【讨论】:

    • 这真的对我有用!非常优雅和简单!我无法表达我多么感谢你的帮助!这个问题快把我逼疯了!
    【解决方案2】:

    这是我的测试代码。

    sp.web.lists.getByTitle('MyList').items.select('Id', 'Title', 'EncodedAbsUrl').get().then( response => {
          response.forEach( item => {
            let _Item = sp.web.lists.getByTitle("MyList").items.getById(item.ID);      
            _Item.attachmentFiles.select('FileName', 'ServerRelativeUrl').get().
            then( responseAttachments => {
              responseAttachments.forEach( attachmentItem => {
                result += item.Title                       + "<br/>" +
                item.EncodedAbsUrl                    + "<br/>" + 
                attachmentItem.FileName          + "<br/>" + 
                attachmentItem.ServerRelativeUrl + "<br/><br/>";
              });
            });        
          });
        })
    

    【讨论】:

    • 嗨,李,谢谢你的回答,但是你编写解决方案的方式一旦你放入一个函数就不起作用,看看我自己的例子(我们的解决方案没有那么不同) - 一旦将第二个查询放入私有 DoStuff() 中,您将仅从第一个查询中获得返回值,但不会从第二个查询中获得返回值:Promise ....
    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 2021-12-27
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多