Я использую JSOM для поиска значения в определенном поле определенного элемента в определенном списке. В целом код ищет членство пользователя в группе (используя SPServices), затем использует это значение для сопоставления с элементом в списке (список содержит поле «Название», заполненное именами групп, и поле «Портал», содержащее другую строку) и пытается чтобы получить другое значение из этого элемента списка. Ошибка, которую я получаю, находится в строке 'var listItemEnumerator = this.listItems.getEnumerator();'. Ошибка: «Коллекция не была инициализирована. Она не запрашивалась или запрос не был выполнен. Возможно, ее необходимо запросить явно».
Вот код:
function getPortalURL(userGroup) {
var URL = "";
var ctx = new SP.ClientContext.get_current();
var list = ctx.get_web().get_lists().getByTitle('Clients');
var query = "<View><Query><Where><Eq><FieldRef Name='Title'><Value Type='Text'>" + userGroup + "</Value></Eq></Where></Query></View>";
var camlQuery = new SP.CamlQuery();
camlQuery.set_viewXml(query);
this.listItems = list.getItems(camlQuery);
ctx.load(this.listItems);
ctx.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded(URL)), Function.createDelegate(this, this.onQueryFailed));
return URL;
}
function onQuerySucceeded(URL) {
var listItemEnumerator = this.listItems.getEnumerator();
while (listItemEnumerator.moveNext()) {
var currentItem = listItemEnumerator.get_current();
URL = currentItem.get_item('Portal');
}
}
function onQueryFailed(sender, args) {
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
РЕДАКТИРОВАТЬ: я обновил свой код, чтобы отразить приведенные ниже изменения, но теперь я вижу, что запрос терпит неудачу при каждой попытке, всегда перенаправляясь к функции отказа. Вот код на случай, если я сделал что-то не так в своей реализации:
function getPortalURL(userGroup) {
var query = "<View><Query><Where><Eq><FieldRef Name='Title'><Value Type='Text'>" + userGroup + "</Value></Eq></Where></Query></View>";
getListItems('Clients', query,
function(items) {
if(items.get_count() === 1) {
var item = items.getItemAtIndex(0);
alert(item.get_item('Portal'));
}
},
function(sender,args){
alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
}
);
}
function getListItems(listTitle, queryText, success, error) {
var ctx = SP.ClientContext.get_current();
var web = ctx.get_web();
var list = web.get_lists().getByTitle(listTitle);
var query = new SP.CamlQuery();
query.set_viewXml(queryText);
var items = list.getItems(query);
ctx.load(items);
ctx.executeQueryAsync(
function() {
success(items);
},
error
);
}