在 Dynamics 365 客户端 v9 中的多个窗体之间共享行为



我正在使用 https://github.com/delegateas/XrmDefinitelyTyped。我为具有名为Program YearStart DateEnd Date的字段的表单创建了以下脚本。我希望这是通用的,这样如果在表单属性中我为 ProgramYear 设置了一个onChange事件,我可以将其指向TI.Forms.EventHandlers.onProgramYearChange然后它将执行脚本。

但是,当我传递字段的执行上下文时,据我所知,我无法访问其他属性的执行上下文,并且我看不到任何获取Start DateEnd Date其他属性的方法。即使我form转换为any也没有定义getAttribute函数。解决这个问题的正确方法是什么?

namespace TI.Forms.EventHandlers {
export function onProgramYearChange(executionContext: Xrm.ExecutionContext<any>) {
var form = executionContext.getFormContext();
form.getAttribute("ti_programyear").addOnChange((context) => {
const updatedProgramYear = context.getEventSource().getValue()[0].name;
XrmQuery.retrieveMultiple(x => x.ti_program_years)
.select(x => [x.ti_start_date, x.ti_end_date])
.filter(x => Filter.equals(x.ti_name, updatedProgramYear))
.execute(programYears => {
const startDateField = form.getAttribute("ti_start_date");
const endDateField = form.getAttribute("ti_end_date");
if (!startDateField.getValue() && !endDateField.getValue()) {
startDateField.setValue(programYears[0].ti_start_date);
endDateField.setValue(programYears[0].ti_end_date);
} 
});
});
}
}

您可以从属性的 executionContext 访问其他属性吗?

你能从属性的 executionContext 访问其他属性吗?

是的,你可以。实际上,当您检查Pass execution context as the first parameter时,CRM会将整个执行上下文传递给事件处理程序。

executionContext.getFormContext()将为您提供类似于早期Xrm.Page的整个formcontext

这就是我们在表单加载时附加onChange时的工作。为简洁起见,已清理。

var standing = formContext.getAttribute("new_standing");
if (standing !== null) {
standing.addOnChange(this.validateStatusChanged);
}

下面是本机Web api调用和从成功回调方法访问formContext。

validateStatusChanged: function (executionContext) {
var formContext = executionContext.getFormContext();
Xrm.WebApi.retrieveMultipleRecords("new_testEntity", query).then(
function success(result) {
if (result.entities.length > 0) {
var limitField = formContext.getAttribute('new_limit');
if (limitField.getValue() !== 1) {
limitField.setValue(1);
}
}
},
function (error) {
//
}
);
}

最新更新