Базовые операции с элементами списков с помощью JSOM

В статье представлены базовые операции с элементами списков SharePoint с помощью JSOM:

  • Получение элементов списков;
  • Создание новых элементов;
  • Изменение и обновление элементов;
  • Удаление элементов.

Получение перечня элементов списка:

var getListItems = function getListItemsF() {
    // Получение контекста по URL
    /*
    var siteUrl = '/sites/data';
    var clientContext = new SP.ClientContext(siteUrl); 
    */
    // Получение текущего контекста
    var clientContext = new SP.ClientContext.get_current(); 
    // Получение элементов
    var oListItems = clientContext
            .get_web()
            .get_lists() // Получение списков
            .getByTitle('Настраиваемый список')
            .getItems(''); // Получение всех элементов
            // .getItemById(<ИД_элемента>); // Получение определенного элемента по ИД
    
    // Получение элементов на основании CAML запроса
    // Конструктор CAML запроса
    /*
    var query = '<View Scope='RecursiveAll'>' +
                    '<Query>' +
                        '<Where>' +
                            '<Eq>' +
                                '<FieldRef Name='Status' />' +
                                '<Value Type='Text'>В работе</Value>' +
                            '</Eq>' +
                        '</Where>' +
                    '</Query>' +
                '</View>';
    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml(query);
    // Используем camlQuery в .getItems(camlQuery)
    */
 
    // Загрузка элементов списка
    var itemsArr = clientContext
                    .loadQuery(oListItems, 'Include(ID,Title)'); 
                    // Мы хотим минифицировать трафик, получая только заданные в Include поля
 
    clientContext.executeQueryAsync(
        function () {
            for (var i = 0, len = itemsArr.length; i < len; i++) {
                console.log("Элемент: ", itemsArr[i].get_fieldValues());
            }
        }, 
        // Функция, которая отработает в случае ошибки
        function(sender, args) {
            alert('Произошла ошибка. ' + args.get_message() + ' ' + args.get_stackTrace());
            // ...
        }
    );
};

getListItems();

Зачастую можно увидеть конструкцию:

clientContext.executeQueryAsync(
        Function.createDelegate(this, this.onQuerySucceeded), 
        Function.createDelegate(this, this.onQueryFailed)
    );
}
 
function onQuerySucceeded(sender, args) {
    // ...
}
    
function onQueryFailed(sender, args) {
    alert('Request failed. ' + args.get_message() + ' ' + args.get_stackTrace());
}

В примерах колбэки в отдельные имнованные функции выделять не буду.

Создание нового элемента списка:

var createListItem = function createListItemF() {
    // Получение текущего контекста
    var clientContext = new SP.ClientContext.get_current(); 
 
    // Получение списка по DisplayName
    //var oList = clientContext.get_web().get_lists().getByTitle('Настраиваемый список'); 
    // Получение списка по GUID списка
    var oList = clientContext.get_web().get_lists().getById('{D13953FD-BA8E-4C87-BCE3-EEC249336EE5}');
    // Определение информации о создании, необходимо чтобы указать папку создания в списке
    // При создании элемента в корне SP.ListItemCreationInformation можно опустить
    var itemCreateInfo = new SP.ListItemCreationInformation();
    //var folderUrl = '/sites/data/Lists/CustomList/FolderName';
    //itemCreateInfo.set_folderUrl(folderUrl);     // Добавление нового элемента
    this.oListItem = oList.addItem(itemCreateInfo);
    // Заполнение атрибутов с помощью метода set_item и указания пары Field InternalName - значение
    oListItem.set_item('Title', 'Новый элемент');
    // Обновление элемента
    oListItem.update();
    // Загрузка создаваемого элемента в контекст
    // На текущий момент сервер еще ничего не знает о новом элементе
    // По сути дела, до выполнения метода executeQueryAsync 
    // на клиенте накапливались инструкции действий
    clientContext.load(oListItem);
    // Обращение на сервер за выполнением очереди
    // Очередь в JSOM выполняется ассинхронно
    clientContext.executeQueryAsync(
        // Функция, которая отработает при успешном выполнении очереди
        function() {
            alert('Создан элемент: ' + oListItem.get_id());
            // ...
        },
        // Функция, которая отработает в случае ошибки
        function(sender, args) {
            alert('Произошла ошибка. ' + args.get_message() + ' ' + args.get_stackTrace());
            // ...
        }
    );
}

createListItem();

Изменение элемента списка:

var updateListItem = function updateListItemF() {
    // Получение текущего контекста
    var clientContext = new SP.ClientContext.get_current(); 
    // Получение инстанса списка по названию
    var oList = clientContext.get_web().get_lists().getByTitle('Настраиваемый список');
    // Получение элемента по его ИД
    this.oListItem = oList.getItemById(21);
    // Обновление атрибутов осуществляется аналогично, как при создании
    oListItem.set_item('Title', 'Измененный элемент');
    // Обновление элемента
    oListItem.update();
    // Обращение на сервер за выполнением очереди
    clientContext.executeQueryAsync(
        // Функция, которая отработает при успешном выполнении очереди
        function() {
            alert('Элемент изменен');
            // ...
        },
        // Функция, которая отработает в случае ошибки
        function(sender, args) {
            alert('Произошла ошибка. ' + args.get_message() + ' ' + args.get_stackTrace());
            // ...
        }
    );
}

updateListItem();

Удаление элемента списка:

var deleteListItem = function deleteListItemF() {
    // Получение текущего контекста
    var clientContext = new SP.ClientContext.get_current(); 
    // Получение инстанса списка по названию
    var oList = clientContext
                    .get_web()
                    .get_lists()
                    .getByTitle('Настраиваемый список');
    // Получение элемента по его ИД
    this.oListItem = oList.getItemById(21);
    // Удаление элемента
    oListItem.deleteObject();
    // Обращение на сервер за выполнением очереди
    clientContext.executeQueryAsync(
        // Функция, которая отработает при успешном выполнении очереди
        function() {
            alert('Элемент удален');
            // ...
        },
        // Функция, которая отработает в случае ошибки
        function(sender, args) {
            alert('Произошла ошибка. ' + args.get_message() + ' ' + args.get_stackTrace());
            // ...
        }
    );
}

deleteListItem();

Так же может быть интересна статья, обыгрывающая все те же действия с использованием библиотеки SPServices: http://blog.arvosys.ru/post/sharepoint-spservices-introduction/


Опубликовано: 25.09.2013
Автор: Андрей Кольтяков