0

我正在使用 word javascript api 开发一个 word 插件,并且需要获取 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,但它会给出错误。请指教。

谢谢。

4

2 回答 2

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);

        });

    }

于 2017-01-31T11:40:38.160 回答
0

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

  1. 默认。无特殊后缀。如果返回值为 null (在这种情况下,选择周围没有内容控件),则此风味会立即引发异常,正如您在问题中正确描述的那样。这是设计使然。
  2. 返回一个“空对象”。它们有一个 *OrNullObject 后缀。这种风格不会引发异常,但会返回一种验证对象是否为空的方法。(注意在这种情况下,这个“空对象”与 JavaScript 的空对象不同,请不要被这个混淆)

第二种风格从 11 月分叉(构建 16.0.7668+)开始可用,因此请确保更新您的客户以查看此功能。

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

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);

                       })



        })

希望这能澄清这个概念

于 2017-01-25T22:56:43.760 回答