Question

Y a-t-il un expert SharePoint qui puisse m'aider à découvrir pourquoi j'obtiens une erreur sur les requêtes de listes ?

J'essaie de récupérer des données de plusieurs listes de manière asynchrone, mais j'obtiens l'erreur suivante : The collection has not been initialized. It has not been requested or the request has not been executed. It may need to be explicitly requested.

Mon code ressemble à ceci :

function loadAllData() {
    loadTeam();
    loadTasks();    

    loadTaskTypes();
}   

Où les fonctions de chargement ressemblent à :

function loadTeam() {
    retrieveListItemsInclude(teamListProperties);
}
function loadTasks() {
    retrieveListItemsInclude(tasksListProperties);
}
...

Et retrieveListItemsInclude la fonction ressemble à :

function retrieveListItemsInclude(listProperties) {
    var clientContext = new SP.ClientContext.get_current();
    var oList = clientContext.get_web().get_lists().getByTitle(listProperties.listName);

    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml('<View><RowLimit>1000</RowLimit></View>');

    this.collListItem = oList.getItems(camlQuery);

    var includeListProperties = buildInclude(listProperties);
    clientContext.load(collListItem, 'Include(Title,ID)');

    switch(listProperties.listName) {
        case 'Task list':
            clientContext.executeQueryAsync(function(){ onTaskQuerySucceeded(listProperties); }, failCallback);
            break;
        case 'Task types list':
            clientContext.executeQueryAsync(function(){ onTaskTypesQuerySucceeded(listProperties); }, failCallback);
            break;
        ...
        case 'Team list':
            clientContext.executeQueryAsync(function(){ onTeamQuerySucceeded(listProperties); }, failCallback);
            break;
    }
}

Et enfin, les rappels de réussite ressemblent à :

function onTasksQuerySucceeded(listProperties) {

    var tasks = [];

    var listItemEnumerator = collListItem.getEnumerator();
    while (listItemEnumerator.moveNext()) {
        var oListItem = listItemEnumerator.get_current();

        var task = {};

        task.id = oListItem.get_item('ID');
        task.title = oListItem.get_item('Title');

        tasks.push(task);
    }

    console.log("Tasks loaded.");
}

Lors de l'exécution loadAllData() fonction, j'obtiens une erreur ci-dessus lors de l'appel collListItem.getEnumerator() dans tous les rappels réussis, mais le dernier.

Cela signifie que si j'appelle loadTeam(); loadTasks(); loadTaskTypes(); dans loadAllData(), j'obtiens une erreur lors des deux premiers rappels réussis, mais loadTaskTypes() s'exécutera correctement.

Pourquoi cela arrive-t-il?Dans retrieveListItemsInclude(listProperties), je crée du local clientContext pour chaque requête vers la liste SharePoint...pourquoi les appels interfèrent ?

Quand j'ai utilisé les promesses de jQuery pour enchaîner les appels loadTeam(); loadTasks(); loadTaskTypes(); l'une après l'autre, toutes les données chargées sans erreur.

J'apprécie toute aide.

Était-ce utile?

La solution

Très proche, mais votre problème est toujours dans les étendues JavaScript :) ...spécifiquement:

this.collListItem = oList.getItems(camlQuery);

Lorsque le rappel réussi arrive, les références ont été perturbées car le deuxième appel de fonction a remplacé le colListItem (qui se trouve sur la portée globale) du premier appel.

Puisque vous utilisez déjà listProperties comme variable unique, vous pouvez l'utiliser davantage.Remplacez les trois lignes par ce qui suit :

listProperties.colListItem = oList.getItems(camlQuery)
var includeListProperties = buildInclude(listProperties);
clientContext.load(listProperties.collListItem, 'Include(Title,ID)');

Dans votre rappel de réussite :

function onTasksQuerySucceeded(listProperties) {
    var tasks = [];
    var listItemEnumerator = listProperties.collListItem.getEnumerator();
    //rest of your code...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top