2017-06-02 4 views
0

Ich habe eine paragraphsArray von Absatzobjekte. Ich habe keywordRanges von Indizes einiger Absätze und Schlüsselwörter. Ich versuche, über KeywordRanges zu iterieren und das RangeObject des Schlüsselworts aus dem Absatzobjekt zu erhalten.Suchmethode auf Word Absatzobjekt funktioniert nicht

Aber der Code nicht nach der ersten Iteration mit diesem Fehler: PropertyNotLoaded: The property 'items' is not available. Before reading the property's value, call the load method on the containing object and call "context.sync()" on the associated request context.

-Code als Referenz:

var myObject = { 
    "2":{ 
    "keywords":["the","which","eye"] 
    }, 
    "4":{ 
    "keywords":["lorem","ipsum"] 
    }, 
    "9":{ 
    "keywords":["hellow","world","foo","bar"] 
    } 
}, 
paragraphsArray = [], 
keywordRanges = [] 

Word.run((context) => { 

    // Create a proxy object for the document body. 
    var paragraphs = context.document.body.paragraphs 

    // Queue a commmand to get the OOXML contents of the body. 
    context.load(paragraphs, 'text, font, style'); 

    // Synchronize the document state by executing the queued commands, 
    // and return a promise to indicate task completion. 
    return context.sync() 
    .then(() => { 
    // push paragraph range objects to an array 
    for (var i = 0; i < paragraphs.items.length; i++) { 
     paragraphsArray.push(paragraphs.items[i]) 
    } 

    $.each(myObject, (key, value) => { 
     $.each(value.keywords, (idx, keyword) => { 
     // add the paragraph range object for the corresponding keyword to an array 
     var obj = {range:paragraphsArray[key], keyword:keyword} 
     keywordRanges.push(obj); 
     }) 
    }) 
    }) 
    .then(()=>{ 
    if(keywordRanges.length > 0){ 
     $.each(keywordRanges, (idx, obj) =>{ 

     // search keyword in the paragraph range object 
     // obj.range is Paragraph Range object 
     var searchKeywordResults = obj.range.search(obj.keyword, { matchWholeWord: true}) 
     context.load(searchKeywordResults, 'text, font') 

     return context.sync().then(() => { 
      for (var i = 0; i < searchKeywordResults.items.length; i++) { 
      console.log(searchKeywordResults.items[i]) 
      } 
     }) 
     }) 
    } 
    }) 
}) 
+0

Versuchen Sie, mit Ihrem Code zu reproduzieren, bekomme ich Fehler "Unable to Property 'Suche' von undefined oder Null Verweis" welche Art von Ihrem Titel übereinstimmt, aber nicht den Fehler entspricht, die Sie in Ihrer Frage erwähnen. Könnten Sie bitte den Titel und/oder die Fehlerbeschreibung erläutern, und was meinen Sie mit "nach der ersten Iteration"? –

+1

Mit diesem etwas mehr arbeiten. Ich kann ein paar Probleme sehen, die relevant sein könnten. 1. Sie definieren die Obj-Variable mit 'var obj = {Bereich: AbsätzeArray [Schlüssel], Schlüsselwort: Schlüsselwort}, so dass die Eigenschaft, die Sie" Bereich "nennen, tatsächlich ein Wort ist. Absatzobjekt, kein Word.Range-Objekt. 2. Sie rufen context.sync innerhalb einer jeden Schleife auf. Dies ist keine gute Übung. Versuchen Sie, jedes searchKeywordResults einem Array in Ihrer Schleife hinzuzufügen. Außerhalb der Schleife context.load() das gesamte Array. –

+1

3. Diesem Kontext.sync folgt ein then(), was bedeutet, dass Sie bei jeder Iteration der Schleife eine neue Promise-Kette haben. –

Antwort

1

Sie eine context.sync in einer Schleife haben, die von einem dann folgt(), Das bedeutet, dass Sie bei jeder Iteration der Schleife eine neue Promise-Kette haben. Alle Versprechen müssen gelöst werden, bevor Word.run() endet.

Verwandte Themen