javascript - 无法创建 LookUpField

标签 javascript typescript sharepoint spfx sharepointframework

我正在创建一个新列表并尝试在列表中添加一个 LookUp 字段。

我检索了我要查找的列表:

let list = sp.web.lists.getByTitle("Trucks");
    list.get().then(list => {
        this._ensureMyList("MySPListTest", list)
    }); 

然后我创建新列表和新字段:

private _ensureMyList(listName: string, truckList): void {
    sp.web.lists.ensure(listName)
        .then((ler: ListEnsureResult) => {
            if (ler.created) {
                console.log("list was created");

                ler.list.fields.add("LookupTest", "SP.FieldLookup", { 
                    Group: "~Example",
                    FieldTypeKind: 7,
                    Filterable: true,
                    Hidden: false,
                    EnforceUniqueValues: true,
                })
                    .then((result) => {
                        console.log("result: ", result);
                    });
            }
        });
}

我得到错误:

Uncaught (in promise) Error: Error making HttpClient request in queryable: [500]  ::> {"responseBody":{"odata.error":{"code":"-2146232832, Microsoft.SharePoint.SPException","message":{"lang":"en-US","value":"Please use addfield to add a lookup field instead."}}},"responseHeaders":{}}

我从以下位置获得了字段名称和 TypeKind:

https://msdn.microsoft.com/en-us/library/office/dn600182.aspx#bk_FieldLookup

我还尝试使用 addLookup 方法:

ler.list.fields.addLookup("LookupTest", truckList.Id, "Truck")
    .then((result) => {
        console.log("result: ", result);
    });

错误:

Uncaught (in promise) Error: Error making HttpClient request in queryable: [400]  ::> {"responseBody":{"odata.error":{"code":"-1, Microsoft.SharePoint.Client.InvalidClientQueryException","message":{"lang":"en-US","value":"The parameter __metadata does not exist in method AddField."}}},"responseHeaders":{}}

最佳答案

您可以考虑使用以下选项来添加查找字段:

1) 通过 Fields.addLookup method :

let list = await sp.web.lists.getByTitle(listTitle);  //get list resource
let lookupList = await sp.web.lists.getByTitle(lookupListTitle).select("Id").get();  //select Lookup List Id 
let field = await list.fields.addLookup(lookupFieldName, lookupList.Id ,"Title"); // add lookup field to list

2) 通过 Fields.createFieldAsXml方法:

let list = await sp.web.lists.getByTitle(listTitle); //get target list resource
let lookupList = await sp.web.lists.getByTitle("Categories").select("Id").get(); //determine lookup list id
let fieldXml = `<Field Name="Category" Type="Lookup" DisplayName="Category" List="{${lookupList.Id}}" ShowField="Title"/>`;  //construct lookup field schema
let field = await list.fields.createFieldAsXml(fieldXml);  //add field to list

引用资料

PnPjs Add Fields

更新

关于调用Fields.addLookup时出现的错误方法:

the parameter __metadata does not exist in method AddField.

最新版本 ( v1.2.1 ) 中 Fields.addLookup method 似乎存在错误.关键是它会生成无效有效负载,如下所示:

{
   "__metadata":{
     "type":"SP.FieldCreationInformation"
   },
   "parameters": { 
          "FieldTypeKind":7,
          "LookupFieldName":"Title",
          "LookupListId":"{list-id}",
          "Title":"Cat"
   }
} 

parameters应该是 http://<site url>/_api/web/lists(guid'<list id>')/fields('<field id>')/addfield 有效负载中的 root 标记端点(source)

According to the history这个错误是在后来的一次提交中引入的,无论如何最好报告一个问题。

关于javascript - 无法创建 LookUpField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52295948/

相关文章:

sharepoint - 如何将根网站重定向到网站集

javascript - 为什么执行这个Else条件?

javascript - 如果未定义,定义数组单元的最佳方法是什么?

javascript - 蒙古语 DeadBeef .toArray() 以意外格式返回 _id

javascript - typescript |套接字IO : How to refer to the client object

typescript - BreezeJS - 如何编写复杂的查询?

javascript - 悬停时显示列描述

javascript - 如何在 iOS 中调用 Javascript 方法?

javascript - 有没有办法在 Vuetify 中获取所选 v-select 选项的索引?

javascript - Angular 7 : ngOnInit() of the a component is getting called every time running unit test case of that component