我正在使用 https://github.com/delegateas/XrmDefinitelyTyped。我为具有名为Program Year
、Start Date
、End Date
的字段的表单创建了以下脚本。我希望这是通用的,这样如果在表单属性中我为 ProgramYear 设置了一个onChange
事件,我可以将其指向TI.Forms.EventHandlers.onProgramYearChange
然后它将执行脚本。
但是,当我传递字段的执行上下文时,据我所知,我无法访问其他属性的执行上下文,并且我看不到任何获取Start Date
和End 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) {
//
}
);
}