Как получить 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, мы предлагаем варианты этого метода / свойства:
- По умолчанию. Никакого специального суффикса. Если возвращаемое значение равно нулю (в этом случае нет никакого элемента управления контентом, окружающего выделение), этот аромат немедленно вызывает исключение, как правильно описано в вашем вопросе. Это по замыслу.
- Возвращает "Нулевой объект". У них есть суффикс *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);
})
})
Надеюсь, что это проясняет концепцию