Не удается создать LookUpField

Я создаю новый список и пытаюсь добавить в него поле 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.info("list was created");

                ler.list.fields.add("LookupTest", "SP.FieldLookup", { 
                    Group: "~Example",
                    FieldTypeKind: 7,
                    Filterable: true,
                    Hidden: false,
                    EnforceUniqueValues: true,
                })
                    .then((result) => {
                        console.info("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.info("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":{}}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
475
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете рассмотреть следующие варианты добавления поля поиска:

1) через Fields.addLookup метод:

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 Добавить поля

Обновлять

Относительно ошибки, возникающей при вызове метода Fields.addLookup:

the parameter __metadata does not exist in method AddField.

похоже, что в последней версии (v1.2.1) для Fields.addLookup метод есть ошибка. Дело в том, что он генерирует полезную нагрузку неверный, примерно так:

{
   "__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 (источник)

По истории эта ошибка была введена с одним из более поздних коммитов, в любом случае лучше сообщить о проблеме.

Вариант 1 дает мне те же ошибки в моем сообщении. Вариант 2 великолепен и работает, спасибо! Есть идеи, почему я продолжаю получать эти ошибки?

Holden1515 13.09.2018 16:39

@ Holden1515, действительно так, ответ обновлен

Vadim Gremyachev 13.09.2018 17:19

Ах! Спасибо за копание и отправку отчета!

Holden1515 13.09.2018 22:44

Другие вопросы по теме