首页 > 解决方案 > 在 Dynamics 365 客户端 v9 中跨多个表单共享行为

问题描述

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

但是,当我传递字段的执行上下文时,据我所知,我无法访问其他属性的执行上下文,而且我看不到任何获取 and 的其他属性的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 访问其他属性吗?

标签: javascriptdynamics-crmmicrosoft-dynamicsdynamics-365dynamics-crm-365-v9

解决方案


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

是的你可以。事实上,当您检查Pass execution context as the first parameter.

executionContext.getFormContext()将为您提供formcontext与之前类似的整体Xrm.Page

这就是我们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) {
        //
    }
);
}

推荐阅读