将模块附加到 Microsoft Dynamics CRM 表单事件

Attaching modules to Microsoft Dynamics CRM Form Events

我正在使用 Typescript 编写自定义代码来处理表单事件。对于每一种形式,我都有一个单独的文件,然后我在编译时将这些文件组合成一个文件,然后我在所有形式中使用该文件。我在将事件附加到表单时遇到问题 - 我收到无法找到我的函数名称的错误。下面是已编译的 Javascript 文件中的 requirejs 模块之一。我曾尝试使用 Evaluation.[function]Forms/Evaluation.[function]EvaluationScripts.[function] 连接事件,但没有成功。我应该使用什么命名结构来附加我的表单事件?

tsc 编译

define("Forms/Evaluation", ["require", "exports", "Global/Helpers", "Global/CCSEQ", "Global/Sync", "Global/Util", "Global/Query"], function (require, exports, Helpers, CCSEQ, Sync_4, Util_10, Query) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var EvaluationScripts = (function (_super) {
__extends(EvaluationScripts, _super);
function EvaluationScripts() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.EmployeeStaffLevelAsOfDateQuery = //query;
return _this;
}
EvaluationScripts.prototype.onLoad = function () {

};
EvaluationScripts.prototype.onSave = function (execObj) {

};
EvaluationScripts.prototype.ccseq_employeeid_onChange = function () {

};

return EvaluationScripts;
}(Helpers.FormLibrary));
exports.Evaluation = new EvaluationScripts();
});

更新

我也尝试过使用 Webpack 来编译我的模块,但是当我将 onLoad 函数连接到 onLoad 事件时仍然出现错误。下面是我的 Webpack 编译文件的示例。

Webpack-编译

var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(6)], __WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, EvaluationForm) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    var Evaluation = EvaluationForm;
}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
                __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));


/***/ }),
/* 6 */
/***/ (function(module, exports, __webpack_require__) {

var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;!(__WEBPACK_AMD_DEFINE_ARRAY__ = [__webpack_require__, exports, __webpack_require__(7), __webpack_require__(1), __webpack_require__(4), __webpack_require__(0), __webpack_require__(3)], __WEBPACK_AMD_DEFINE_RESULT__ = function (require, exports, Helpers, CCSEQ, Sync_1, Util_1, Query) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    var evaluationPeriodDate;
    var EmployeeStaffLevelAsOfDateQuery = xml;
    function onLoad() {

    }
    exports.onLoad = onLoad;
    function onSave(execObj) {

    }
    exports.onSave = onSave;
    function onCreate() {

    }
    exports.onCreate = onCreate;
    function ccseq_employeeid_onChange() {

    }
    exports.ccseq_employeeid_onChange = ccseq_employeeid_onChange;

}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__),
                __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));

我认为您在尝试使用 WebPack 时可能会稍微复杂一些。
我对所有 CRM JavaScript 使用 TypeScript,我使用的模式是为每个实体创建一个 ts 文件,如下所示:

/// <reference path="../type definations/xrm.d.ts" />
/// <reference path="../type definations/jquery.d.ts" />

namespace xrm.entities.contact {

    class FormScripts {
        constructor() {
            //
        }

        private _onLoad() {

        }


        public OnLoad() {
            this._onLoad();
        }
    };

    //Expose the same js interface as the legacy code
    export var code;
    code = new FormScripts();
}

我在 CRM 中的联系人实体的 OnLoad 处理程序看起来像:

xrm.entities.contact.code.OnLoad

我们使用 gulp 将所有引用的库合并到一个 javascript 文件中,该文件可以作为一个网络资源上传到 CRM

问题不在于 webpack。问题是函数没有设置到全局范围。

全局添加函数的最简单方法是

window.Evaluation = new EvaluationScripts();

最后,我创建了一个导入所有表单文件的新文件。这与 rexkenley 的建议一起使我能够使用 CCSEQ.[FormName].

成功连接表单事件

Library.ts

import {Test as TestForm} from './path/to/form';

(<any>window).CCSEQ = {};

(<any>window).CCSEQ.Test = TestForm;