Как получить изображение из приложения библиотеки изображений с помощью SharePoint JSOM?

Я пытаюсь написать веб-часть SharePoint для онлайн-сайта, размещенного на SharePoint. Я огляделся, но не могу найти ничего, кроме как получить доступ к основному списку. Мне нужно получить доступ к списку, созданному приложением Image Libary, но когда я смотрю на столбцы списка в своем пользовательском интерфейсе администратора, я вижу только текстовые столбцы, и я только понял, как получить доступ к этим текстовым столбцам в моем коде js: "

var oneList = this.web.get_lists().getByTitle("RotatingBannerImages");
var query = new SP.CamlQuery();
this.listItems = oneList.getItems(query);
context.load(listItems);

context.executeQueryAsync(
    Function.createDelegate(this, successHandler),
    Function.createDelegate(this, errorHandler)
);

function successHandler() {
    var itemEnum = listItems.getEnumerator();
    while (itemEnum.moveNext()) {
        var item = itemEnum.get_current();
        console.log(item.get_item("Title")); // Returns null on image list.
    }
}

Выражение item.get_item("Title") возвращает заголовок элемента списка, когда я обращаюсь к простому текстовому списку, который я использовал для создания своего кода API перед переходом в список библиотеки изображений. Почти все, что я пробую в отладчике, возвращает объект, который требует еще одного вызова метода только для его проверки.


person ProfK    schedule 15.12.2014    source источник


Ответы (2)


Существует как минимум 3 варианта доступа к свойствам элемента списка через SharePoint JSOM.

В следующем примере показано, как получить доступ к SP.ListItem. свойство .id:

var ctx = SP.ClientContext.get_current();
var web = ctx.get_web();
var list = web.get_lists().getByTitle("Images");
var items = list.getItems(SP.CamlQuery.createAllItemsQuery());
ctx.load(items);

ctx.executeQueryAsync(
    function() {

       for(var i = 0; i < items.get_count(); i++) {
           var item = items.getItemAtIndex(i);    

           console.log(item.get_item("ID")); // 1st Option 
           console.log(item.get_fieldValues().ID); // 2nd Option
           console.log(item.get_id()); // 3d Option
       }
    },
    function(sendera,args){
       console.log(args.get_message());
    }
);

Вариант 1

Использование свойства SP.ListItem.item чтобы получить или установить указанное значение поля, например, чтобы вернуть URL-адрес изображения элемента списка в библиотеке изображений:

var imageUrl = item.get_item("FileRef")

Вариант 2

свойство SP.ListItem.fieldValues хранит коллекцию пар ключ/значение, содержащих имена и значения для полей элемента списка, например:

var imageUrl = item.get_fieldValues().FileRef;

or

var imageUrl = item.get_fieldValues()['FileRef'];

Вариант 3

объект SP.ListItem предоставляет некоторые такие свойства, как свойство SP.ListItem.id, например:

var itemId = item.get_id();
person Vadim Gremyachev    schedule 15.12.2014
comment
Спасибо за очень информативный ответ, @Vadim, но моя настоящая проблема не в том, чтобы получить доступ к свойствам элемента, а в том, что я не знаю, к каким свойствам получить доступ, чтобы получить данные моего изображения или URL-адрес. - person ProfK; 15.12.2014

Вы должны загрузить сведения о файле, здесь код

var web = context.get_web();
var list = web.get_lists().getByTitle("Pictures");

var query = new SP.CamlQuery();
this.listItems = list.getItems(query);
context.load(listItems);

context.executeQueryAsync(
    Function.createDelegate(this, successHandler),
    Function.createDelegate(this, errorHandler)
);

function successHandler() {
    var itemEnum = listItems.getEnumerator();
    while (itemEnum.moveNext()) {
        var item = itemEnum.get_current();
        this.fileImg = item.get_file();
        context.load(fileImg);

        context.executeQueryAsync(
            Function.createDelegate(this, successFile),
            Function.createDelegate(this, errorHandler)
        );
    }
}

function successFile() {
    console.log(fileImg.get_name());
    console.log(fileImg.get_serverRelativeUrl());
}

function errorHandler()
{
    console.log("Error");
}

В любом случае, если вы можете использовать jquery, я предлагаю вам использовать REST следующим образом: как видите, вы пишете меньше кода;

var urlAll = "http://mysite/_api/web/lists/getbytitle('RotatingBannerImages')/items?$expand=File"

$.ajax({
    url : urlAll,
    headers : {
        'Content-Type': 'application/json;odata=verbose'
    },
    type: 'GET',
    success: function(data, textStatus, jqXHR) {
        var files  = data.d.results;
        files.forEach(function(item){
            console.log(item.File.ServerRelativeUrl);
            console.log(item.File.Name);
        });
    },
    error: function(jqXHR, textStatus, errorThrown) {
        console.log(errorThrown);
    }
});
person Max    schedule 15.12.2014
comment
К сожалению, это неверно, если вам не нужны определенные свойства файла, вам вообще не нужно загружать связанный файловый объект. Например, такие свойства, как имя файла и URL-адрес, можно легко получить из свойств FileLeafRef и FileRef List Item. - person Vadim Gremyachev; 15.12.2014