Как получить parentContentControls из текущего выделения в надстройке слова

Я разрабатываю надстройку для слова, используя слово 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 ответа

Это проблема версии 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);

        });

    }

Это очень хороший вопрос, и он касается одной из основных концепций технологии office.js: как мы обрабатываем нули? Короче говоря, всякий раз, когда существует вероятность, что метод / свойство возвращает значение null, мы предлагаем варианты этого метода / свойства:

  1. По умолчанию. Никакого специального суффикса. Если возвращаемое значение равно нулю (в этом случае нет никакого элемента управления контентом, окружающего выделение), этот аромат немедленно вызывает исключение, как правильно описано в вашем вопросе. Это по замыслу.
  2. Возвращает "Нулевой объект". У них есть суффикс *OrNullObject. Этот аромат НЕ генерирует исключение, но возвращает способ проверить, является ли объект нулевым или нет. (обратите внимание, что в этом контексте этот "нулевой объект" отличается от нулевого JavaScript, пожалуйста, не путайте это)

Второй вариант доступен начиная с ноябрьского форка (сборка 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);

                       })



        })

Надеюсь, что это проясняет концепцию

Другие вопросы по тегам