Как получить formContext в ленте командой Dynamics 365 9.0
В Dynamics 365 9.0 произошли довольно большие изменения в том, как получить доступ к атрибутам и элементам управления формы - вместо Xrm.Page
пространство имен, мы должны пройти executionContext
к функции и получить formContext
с помощью getFormContext()
функция. Это работает нормально, и у меня никогда не было проблем с использованием этого подхода.
Однако я еще не разобрался, как правильно получить доступ formContext
в функциях, которые вызываются из ленты. Документация говорит, что это должно быть действительно просто:
function myFunction(executionContext) {
var formContext = executionContext.getFormContext();
var focusFieldValue = formContext.ui.controls.get(PrimaryControlId).getAttribute().getValue();
}
Но это не говорит, как пройти executionContext
функция ленты. В обычных функциях есть флажок "Передавать контекст выполнения как первый параметр", но как насчет функций ленты? Есть параметры, которые мы можем передать в эти функции, но они просто GUID выбранных записей, или тип выбранной записи, или даже список объектов, но я не смог найти в документации, если есть параметр, равный executionContext
, Кто-нибудь уже решил эту проблему?
Также я знаю, что могу использовать Xrm.Page, и он будет работать (пока, по крайней мере,...), но я хотел бы знать, как это можно сделать, используя последние рекомендации в версии 9.0
Обновление 1:
Согласно предложению Скотта и этой статье я передал PrimaryControl моей команде ленты, но, к сожалению, аргумент имеет тип Mscrm.FormControlLite
и это не имеет getAttribute
функция или любая функция, которая позволила бы получить доступ к formContext (по крайней мере, я не вижу ничего полезного). Несколько скриншотов из инструментов разработчика:
Таким образом, это выглядит как представление формы некоторого вида, но, вероятно, не имеет отношения к formContext (я предполагаю, что если лента будет вызываться из списка записей, этот элемент может иметь тип сетки или что-то в этом роде)
2 ответа
Согласно https://docs.microsoft.com/en-us/dynamics365/get-started/whats-new/customer-engagement/important-changes-coming вы передаете его как Параметр PrimaryControl.
Поэтому, если вы передаете PrimaryControl в качестве второго параметра в командную функцию, подобную этой, вы можете использовать
arguments[1].getAttribute(…)
После передачи primaryControl, как предложено @ scott-durow, лучше не использовать primaryControl.getFormContext(), а вместо этого использовать primaryControl, как будто это formContext.
Согласно документации (1/2/2019): https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/customize-dev/pass-dynamics-365-data-page-parameter-ribbon-actions tape -actions, нужно выполнять операции с primaryControl, как будто это formContext.
function mySampleFunction(primaryControl) {
var formContext = primaryControl;
// Perform operations using the formContext object
}
Но ключевая часть предоставленного примера такова: // Выполнение операций с использованием объекта formContext, являющегося ключом (не знаю, почему они добавили строку var formContext = primaryControl, imo, было бы яснее, если бы вместо этого они просто показывали пример: primaryControl.getAttribute ('xxxx');
Я подозреваю, что код primaryControl.getFormContext() начал использоваться, потому что именно так вы получаете formContext при работе с формами ( https://docs.microsoft.com/en-us/dynamics365/customer-engagement/developer/clientapi/clientapi-form-context).
Проблема с использованием primaryControl.getFormContext() заключается в том, что он работает с обычным веб-интерфейсом, но не работает с UCI. Но если вы используете primaryControl, как если бы это был контекст формы, тогда он работает как с устаревшими интерфейсами веб-клиента, так и с интерфейсом uci.
Вот функция, которую я использую:
function getFormContext(executionContext) {
var formContext = null;
if (executionContext !== null) {
if (typeof executionContext.getAttribute === 'function') {
formContext = executionContext; //most likely called from the ribbon.
} else if (typeof executionContext.getFormContext === 'function'
&& typeof(executionContext.getFormContext()).getAttribute === 'function') {
formContext = executionContext.getFormContext(); // most likely called from the form via a handler
} else {
throw 'formContext was not found'; //you could do formContext = Xrm.Page; if you like.
}
}
return formContext;
}
У меня была такая же проблема. Я обнаружил, что в Microsoft doco произошла ошибка. Пожалуйста, следуйте указаниям Скотта, передавая параметр CRM из действия команды ленты. В функции JavaScript, пожалуйста, попробуйте ниже, чтобы получить контекст формы
var formContext = primaryControl.getFormContext();
это исправило мою проблему.
В настоящее время я использую CRM 8.2 в сети, но сохраняю свой код обновляемым до 9.0, поэтому я передаю primarycontrol в качестве параметра ленты, но не могу получить метод getFormContext(), поскольку он имеет тип Mscrm.FormControlLite и не имеет getAttribute, getFormContext() метод или что-нибудь
Есть небольшая хитрость, которую вы можете сделать, чтобы не передавать первичный элемент управления в качестве параметра Crm с помощью утилиты RibbonWorkbench, или, если бы вы сделали это, он не сработал бы для вас, поскольку это могло бы произойти, если вы пытались сделать это дома. лента
var context=Xrm.Utility.getGlobalContext();
Я надеюсь, что это работает для вас или кого-либо еще.