如何从单词加载项中的当前选择中获取parentContentControls

时间:2017-01-25 10:01:44

标签: ms-word office365 office-js word-addins javascript-api-for-office

我正在使用word javascript api开发一个单词加载项,需要获取contentControl以进行当前选择,因此使用parentContentControl进行当前选择。

**Code:**    
var range = context.document.getSelection().parentContentControl;
context.load(range);

但在控制台上显示错误: 错误:{"name":"OfficeExtension.Error","code":"GeneralException","message":"GeneralException","traceMessages":[],"debugInfo":{"errorLocation":"Range.parentContentControl"},"stack":"GeneralException: GeneralException\n at Anonymous function (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.js:19:189006)\n at pi (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.js:19:211583)\n at ht (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.js:19:211670)\n at g (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.js:19:211490)\n at l (https://appsforoffice.microsoft.com/lib/1/hosted/word-win32-16.01.js:19:210076)"}

Debug info: {"errorLocation":"Range.parentContentControl"}

如果当前选择不包含任何contentControl,它应该返回NULL,但它给出错误。请指教。

感谢。

2 个答案:

答案 0 :(得分:1)

这是Microsoft Office word 2016版本问题。 相同的代码在 16.0.7571.7095。中工作正常,但没有使用其他单词2016版本。

 function insideOfContentControlCheck() {
        Word.run(function (ctx) {
            var myCC = ctx.document.getSelection().parentContentControl;
            ctx.load(myCC); // I think this is the part you are missing!
            return ctx.sync()
            .then(function () {
                console.log(myCC.title);// if there is a content control we'll show the title

            });


        }).catch(function (e) {
            //there is no ContentControl.
            console.log("Error", e.message);

        });

    }

答案 1 :(得分:0)

这是一个非常好的问题,并且涉及office.js技术的核心概念之一:我们如何处理空值?长话短说,只要是一种方法/属性返回null的可能性,我们就会提供该方法/属性的风格:

  1. 默认。没有特殊后缀。如果返回值为null(在这种情况下,选择周围没有内容控件),这种风格会立即抛出异常,正如您在问题中正确描述的那样。这是设计的。
  2. 返回"空对象"。它们具有* OrNullObject后缀。这种风格 NOT 抛出异常,但返回一种方法来验证对象是否为null。 (请注意,在这种情况下,这个' null对象'与JavaScript null不同,请不要因此而混淆)
  3. 第二种口味可以从11月份的叉子(版本16.0.7668+)开始提供,所以请确保更新您的客户以确保其正常工作。

    所以要具体回答你的问题:这种行为是设计的。如果要验证选择中是否存在内容控件,则需要使用range.parentContentControlOrNullObject属性。然后你可以检查它是否为null。以下是如何实现此目的的示例:

    
    
    var myCC = context.document.getSelection().parentContentControlOrNullObject; // this flavor will not throw an exception.
                context.load(myCC);
                return context.sync()
                .then(function () {
                    if (myCC.isNullObject)  // when using this flavor of the property you will get a isNullObject to check if its null or not and act accordingly.
                       console.log("There is no content control sorrounding");
                    else
                        app.showNotification("there is a content control wrapping the selection.");
    
                })
                   .catch(function (e) {
                             console.log(e.message);
    
                           })
    
    
    
            })
    
    
    

    希望这能澄清概念