sharepoint
Работа с объектной моделью клиента JavaScript (JSOM)
Поиск…
замечания
Фон
Объектная модель JavaScript была представлена в SharePoint 2010. Она предоставляет на стороне клиента многие из объектов, которые ранее были доступны только через серверный код или через выделенные веб-службы.
Встраивание JavaScript в страницы SharePoint
В SharePoint 2013 вы можете разместить свой JavaScript в веб-части редактора сценариев.
В SharePoint 2010 вы можете использовать свойство «content link» веб-части Редактора контента для ссылки на HTML-файл, содержащий встроенный скрипт.
Ссылка на объект
Конструкторы, методы и свойства всех объектов, найденных в пространстве имен SP
, описаны здесь в ссылке на объектную модель клиента SharePoint 2013.
Ссылка на объектную модель клиента JavaScript 2010 доступна здесь .
Шаблон асинхронного программирования JSOM
При использовании объектной модели клиента JavaScript код обычно принимает следующий шаблон:
- Получить объект
ClientContext
. - Используйте объект
ClientContext
для извлечения объектов, представляющих объекты в объектной модели SharePoint, например списки, папку, представления. - Инструкции об очередях, выполняемые против объектов. Эти инструкции еще не передаются на сервер.
- Используйте функцию
load
чтобы сообщитьClientContext
какую информацию вы хотите получать с сервера. -
ClientContext
функциюexecuteQueryAsync
объектаClientContext
, чтобы отправить на сервер запрошенные очереди, передав две функции обратного вызова для успешного выполнения или отказа. - В функции обратного вызова работайте с результатами, возвращаемыми с сервера.
альтернативы
Клиентские альтернативы JSOM включают веб-службы SharePoint, конечные точки REST и объектную модель .NET .
Получение типов содержимого библиотеки с использованием имени библиотеки
function getContentTypes(site_url,name_of_the_library){
var ctx = new SP.ClientContext(site_url);
var web = ctx.get_web();
list = web.get_lists().getByTitle(name_of_the_library);
// You can include any property of the SP.ContentType object (sp.js), for this example we are just getting the name
ctx.load(list,'ContentTypes.Include(Name)');
ctx.executeQueryAsync(onQuerySucceeded, onQueryFailed);
}
function onQuerySucceeded(sender, args) {
// var list is the one that we used in function "getContentTypes"
var contentTypesEnumerator = (list.get_contentTypes()).getEnumerator();
while (contentTypesEnumerator.moveNext()) {
var contentType = contentTypesEnumerator.get_current();
alert(contentType.get_name());
}
}
function onQueryFailed(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
Удаление элемента в списке
SP.SOD.executeOrDelayUntilScriptLoaded( function(){ deleteItem(1); }, "sp.js");
function deleteItem(id){
var clientContext = new SP.ClientContext();
var list = clientContext.get_web().get_lists().getByTitle("List Title");
var item = list.getItemById(id);
item.deleteObject();
clientContext.executeQueryAsync(function(){
alert("Item #"+id+" deleted successfully!");
},function(sender,args){alert(args.get_message());});
}
Создание элементов или папок
Создание элементов списка
SP.SOD.executeOrDelayUntilScriptLoaded(createItem,"sp.js");
function createItem(){
var clientContext = new SP.ClientContext();
var list = clientContext.get_web().get_lists().getByTitle("List Title");
var newItem = list.addItem();
newItem.set_item("Title","Example Title");
newItem.update();
clientContext.load(newItem); // only needed to retrieve info from newly created item
clientContext.executeQueryAsync(function(){
var itemId = newItem.get_item("ID");
alert("Item #"+itemId+" Created Successfully!");
},function(sender,args){
alert(args.get_message());
});
}
В приведенном выше примере показано, что элемент списка создается путем выполнения следующих действий:
- Вызовите метод
addItem
объекта списка, чтобы получить объект item - Вызовите метод
set_item
в результирующем объекте элемента списка, чтобы задать каждое значение поля по желанию - Вызовите метод
update
объекта объекта списка, чтобы указать, что изменения должны быть зафиксированы - Вызовите
executeQueryAsync
объекта контекста клиента для выполнения заданий в очереди
Обратите внимание, что вам не нужно передавать объект нового объекта в метод load
контекста клиента для создания элемента. Этот шаг необходим только в том случае, если вы хотите получить какие-либо значения поля этого элемента с сервера.
Создание папок
Создание папки аналогично добавлению элемента в список. Разница заключается в том, что сначала нужно создать ListItemCreationInformation
объект и установить его underlyingObjectType
свойство SP.FileSystemObjectType.folder
и его leafName
собственности на нужное имя новой папки.
Затем объект передается в качестве параметра в методе addItem
в библиотеке для создания папки.
// ...
var itemCreateInfo = new SP.ListItemCreationInformation();
itemCreateInfo.set_underlyingObjectType(SP.FileSystemObjectType.folder);
itemCreateInfo.set_leafName(folderName);
var newItem = list.addItem(itemCreateInfo);
// ...
Чтобы зафиксировать изменение, вызовите executeQueryAsync
объекта ClientContext
через который была ClientContext
доступ к библиотеке.
Полный пример ниже создает папку с именем, основанным на текущей временной отметке, затем открывает эту папку в модальном диалоговом окне.
SP.SOD.executeOrDelayUntilScriptLoaded(createFolder,"sp.js");
function createFolder(){
var now = new Date();
var timeStamp = now.getYear() + "-" + (now.getMonth()+1) + "-" + now.getDate()
+ "T" + now.getHours()+"_"+now.getMinutes()+" "+now.getSeconds()+"_"+now.getMilliseconds();
var clientContext = new SP.ClientContext();
var list = clientContext.get_web().get_lists().getByTitle("Library Title");
var itemCreateInfo = new SP.ListItemCreationInformation();
itemCreateInfo.set_underlyingObjectType(SP.FileSystemObjectType.folder);
itemCreateInfo.set_leafName(timeStamp);
var newItem = list.addItem(itemCreateInfo);
newItem.update();
clientContext.load(newItem);
var rootFolder = list.get_rootFolder(); // Note: use a list's root folder to determine its server relative URL
clientContext.load(rootFolder);
clientContext.executeQueryAsync(function(){
var itemId = newItem.get_item("ID");
var name = newItem.get_item("FileLeafRef");
SP.UI.ModalDialog.showModalDialog(
{
title: "Folder \""+name+"\" (#"+itemId+") Created Successfully!",
url: rootFolder.get_serverRelativeUrl() + "/" + name
}
);
},function(sender,args){alert(args.get_message());});
}
Получить информацию о текущем пользователе
SP.SOD.executeOrDelayUntilScriptLoaded(showUserInfo,"sp.js");
function showUserInfo(){
var clientContext = new SP.ClientContext();
var user = clientContext.get_web().get_currentUser();
clientContext.load(user);
clientContext.executeQueryAsync(function(){
var details = "ID: "+user.get_id()+"\n"+
"Title: "+user.get_title()+"\n"+
"Login: "+user.get_loginName()+"\n"+
"Email: "+user.get_email();
alert(details);
},function(sender,args){alert(args.get_message());})
}
Получить элемент списка по идентификатору
SP.SOD.executeOrDelayUntilScriptLoaded(myFunction,"sp.js");
function myFunction(){
var clientContext = new SP.ClientContext();
var list = clientContext.get_web().get_lists().getByTitle("List Title");
var item = list.getItemById(1); // get item with ID == 1
clientContext.load(item);
clientContext.executeQueryAsync(
function(){ // onSuccess
var title = item.get_item("Title");
alert(title);
},
function(sender,args){ // onError
alert(args.get_message());
}
);
}
Получить элементы списка по запросу CAML
Основной пример
Используйте set_viewXml
метод объекта SP.CamlQuery указать CAML запрос для извлечения элементов.
SP.SOD.executeOrDelayUntilScriptLoaded(showListItems,"core.js");
function showListItems(){
var clientContext = new SP.ClientContext();
var list = clientContext.get_web().get_lists().getByTitle("List Title");
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml(
"<View><Query>" +
"<Where>" +
"<Eq><FieldRef Name=\"Title\"/><Value Type=\"Text\">Value</Value></Eq>" +
"</Where>" +
"<OrderBy><FieldRef Name=\"Modified\" Ascending=\"FALSE\"/></OrderBy>" +
"</Query>"+
//"<RowLimit>5000</RowLimit>" +
"</View>");
var items = list.getItems(camlQuery);
clientContext.load(items);
clientContext.executeQueryAsync(function(){
var itemArray = [];
var itemEnumerator = items.getEnumerator();
while(itemEnumerator.moveNext()){
var item = itemEnumerator.get_current();
var id = item.get_item("ID");
var title = item.get_item("Title");
itemArray.push(id + ": " + title);
}
alert("ID: Title\n"+itemArray.join("\n"));
},function(sender,args){alert(args.get_message());});
}
Подкачка результатов запроса CAML
Вы можете использовать элемент RowLimit
в запросе CAML для получения только одного подмножества результатов с каждым запросом.
Используйте метод get_listItemCollectionPosition
коллекции элементов списка для извлечения текущей позиции, а затем используйте это значение в качестве параметра в объекте set_listItemCollectionPosition объекта set_listItemCollectionPosition
для получения следующей партии результатов.
SP.SOD.executeOrDelayUntilScriptLoaded(showListItems,"sp.js");
function showListItems(){
var itemArray = [];
var clientContext = new SP.ClientContext();
var list = clientContext.get_web().get_lists().getByTitle("List Title");
var viewXml =
"<View><Query>" +
"<OrderBy><FieldRef Name=\"Modified\" Ascending=\"FALSE\"/></OrderBy>" +
"</Query>"+
"<RowLimit>1</RowLimit>" +
"</View>";
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml(viewXml);
var items = list.getItems(camlQuery);
clientContext.load(items);
clientContext.executeQueryAsync(loadResults,showError);
function loadResults(){
var resultsFound = false;
var itemEnumerator = items.getEnumerator();
while(itemEnumerator.moveNext()){
var item = itemEnumerator.get_current();
var id = item.get_item("ID");
var title = item.get_item("Title");
itemArray.push(id + ": " + title);
}
var pos = items.get_listItemCollectionPosition();// <- get position
if(pos !== null){ // <-- position is null when no more results are returned
if(confirm("Results so far: \nID: Title\n"+itemArray.join("\n"))){
camlQuery = new SP.CamlQuery();
camlQuery.set_listItemCollectionPosition(pos);// <- set position for next batch
camlQuery.set_viewXml(viewXml);
items = list.getItems(camlQuery);
clientContext.load(items);
clientContext.executeQueryAsync(loadResults,showError);
}
}else{
alert("Total Results: \nID: Title\n"+itemArray.join("\n")); // <- display when no more results
}
}
function showError(sender,args){
alert(args.get_message());
}
}