JSOM / Javascript получить имя типа содержимого со всеми другими столбцами

1

У меня есть следующий метод, который правильно получает элементы списка из запроса sharepoint, однако тип содержимого требует специального обращения и его не возвращается.

function getListItems(listId, camlQueryString, selectProperties){  
                        var deferred = $q.defer();
                        var context = SP.ClientContext.get_current();
                        var web = context.get_web();

                        var list = web.get_lists().getById(listId);

                        var camlQuery = new SP.CamlQuery();
                            camlQuery.set_viewXml(camlQueryString);

                        var listItems = list.getItems(camlQuery);

                        //var includesString = "Include(ID,Title,AssignedTo, WorkflowOutcome, ApproverComments, FileRef, WorkflowItemId, Created, Modified)"; // + selectProperties.join(", ") +  ")";
                        if(selectProperties) {
                            var includesString = convertSelectPropertiesToIncludesString(selectProperties);
                            context.load(listItems, includesString);
                        } else {
                            context.load(listItems);
                        }
                        context.executeQueryAsync(
                           function() {
                                $log.info("Successfully retrieved list item result");

                                deferred.resolve(listItems);
                           },
                           function(error, errorInfo) {
                                $log.warn("Retrieving list item result failed");

                                deferred.reject(errorInfo);
                           }
                        );
                        return deferred.promise;
                    }

Мне нужно, чтобы имя типа содержимого возвращалось в том же массиве listitems, что и в другом поле.

Я нашел несколько примеров, но я не уверен, как интегрировать этот код в мой, потому что кажется, что двойной вызов необходим для каждого элемента.

Обновление 1

Я пытаюсь использовать указанный выше метод:

function GetRelatedBillingDocumentsFromList(selectProperties, currentBillCyclePath, clientCode, jobCodes, engagementCode, enhanceFunctions) {
                $log.info("Retrieving related billing documents for bill cycle with name [" + currentBillCyclePath + "]");                  
                var deferred = $q.defer();
                var webUrl = _spPageContextInfo.webAbsoluteUrl;
                var viewFields = spService.ConvertSelectPropertiesToViewFields(selectProperties);
                // query must return the documents for the same client but in other bill cycles not the current one
                var camlQuery = '<View>' +   viewFields + 
                        '<Query>' +
                            '<Where>' +
                                //'<And>' +
                                    '<Eq>' +
                                        '<FieldRef Name="ClientCode" />' +
                                        '<Value Type="Text">'+ clientCode + '</Value>' +
                                    '</Eq>' +
                                //  '<Neq>' +
                                //      '<FieldRef Name="ContentType" />' +
                                //      '<Value Type="Computed">Bill Cycle</Value>' +
                                //  '</Neq>' +
                                //'</And>' +
                            '</Where>' +
                            //'<QueryOptions>' +
                            //  '<ViewAttributes Scope="RecursiveAll" />' +
                            //'</QueryOptions>' +
                        '</Query>' +
                    '</View>';

                var billCyclesListId = "{c23bbae4-34f7-494c-8f67-acece3ba60da}";                    
                spService.GetListItems(billCyclesListId, camlQuery, selectProperties)
                .then(function(listItems) {
                    var listItemsWithValues = [];
                    if(listItems) {
                        var enumerator = listItems.getEnumerator();
                        while (enumerator.moveNext()) {
                            var listItem = enumerator.get_current();
                            var listItemValues = [];                                
                            selectProperties
                            .forEach(function(propertyName) {
                                if(propertyName==='ContentType'){
                                    var value = listItem.get_item('ows_ContentType');
                                }else{
                                    var value = listItem.get_item(propertyName);
                                }                               
                                listItemValues[propertyName] = value;
                            });

                            listItemsWithValues.push(listItemValues);
                        }
                    }

                    // Create the full item url
                    listItemsWithValues.forEach(function(listItem) {
                        var fileDirRef = listItem["FileRef"];
                        var id = listItem["ID"];
                        var serverUrl = _spPageContextInfo.webAbsoluteUrl.replace(_spPageContextInfo.webServerRelativeUrl,"");                          
                        var dispFormUrl = serverUrl + fileDirRef + "/DispForm.aspx?ID=" + id;
                        listItem["FileRef"] = dispFormUrl;
                    });

                    var enhancedListItemValues = spService.SpSearchQuery.EnhanceSearchResults(listItemsWithValues, enhanceFunctions);                       
                    deferred.resolve(listItemsWithValues);
                })
                .catch (function (message) {
                    deferred.reject();
                });

                return deferred.promise;
            }

как вы можете видеть, мне нужен способ вернуть имя типа контента в один и тот же массив значений простым способом

Теги:
sharepoint

1 ответ

1
Лучший ответ

Вы можете использовать свойство ows_ContentType чтобы получить имя типа содержимого.

Так, добавьте ows_ContentType в вашей includesString переменной или selectProperties параметра.

После этого в коде вы можете использовать его, как показано ниже:

context.executeQueryAsync(
   function() {
        var listItemEnumerator = listItems.getEnumerator();
        while (listItemEnumerator.moveNext()) {
            var oListItem = listItemEnumerator.get_current();
            console.log(oListItem.get_item('ows_ContentType'));         
        }
   },
   function(error, errorInfo) {
        console.log(errorInfo);
   }
);

Обновление - полный код

var context = SP.ClientContext.get_current();
var web = context.get_web();

var list = web.get_lists().getByTitle("Test");

var includesString = "Include(ID,Title,Created, Modified, ows_ContentType)";

var camlQuery = SP.CamlQuery.createAllItemsQuery();

var listItems = list.getItems(camlQuery);

context.load(listItems, includesString);

context.executeQueryAsync(
   function() {
        var listItemEnumerator = listItems.getEnumerator();
        while (listItemEnumerator.moveNext()) {
            var oListItem = listItemEnumerator.get_current();
            console.log(oListItem.get_item('ows_ContentType'));         
        }
   },
   function(error, errorInfo) {
        console.log(errorInfo);
   }
);
  • 0
    но как я могу добавить его к тому же массиву значений? если это другой обратный вызов
  • 0
    пожалуйста, смотрите Update1
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню