Единый интерфейс Microsoft Dynamics 365 - JavaScript

Мой экземпляр D365 обновлен до унифицированного интерфейса, а JavaScript за командами ленты сломался. Насколько я понимаю, необходимо заменить Xrm.Page и добавить PrimaryControl в качестве параметра Crm в ленточном верстаке.

Я так и сделал, обновил и код, но получаю ошибку:

TypeError: невозможно прочитать свойство getControl для undefined
в Object.OnSuccess

в Object.ChangeStatusMultiple

Это код:

Applikata.Commands =
{
    ChangeStatus: function (id, entityName, status, state, successCallback,context) {
        var formContext = context;
        var entity = {};
        var arrStatus = status.SourceControlId.split("|");
        var _status = (state == 0) ? 100000000 : 100000002;

        // status arraives in following form
        // ac_grade | NoRelationship | Form | ac.ac_grade.Button17.Button

        if (arrStatus.length == 4)
            _status = arrStatus[arrStatus.length - 1].split(".")[2];

        entity.statuscode = { Value: _status };
        entity.statecode = { Value: state };

        //console.log(status);
        // ac_grade|OneToMany|SubGridAssociated|ac.ac_grade.100000008.GridButton
        //console.log("ChangeStatus:" + id + " entityName:" + entityName + " status:" + status + " state:" + state);
        //console.log("SDK.REST:" + SDK.REST);

        SDK.REST.updateRecord(
            id,
            entity,
            entityName,
            successCallback,
            function (error) {
                alert(error.message);
            }
        );
    },
    ChangeStatusMultiple: function (selectedIds, entityName, status, state, gridName, context) {
        var formContext = context;

        selectedIds.forEach(
            function (id) {
                Applikata.Commands.ChangeStatus(id, entityName, status, state, function () {});
            }
        );
        Applikata.Commands.OnSuccess(gridName);
    },

    OnSuccess: function (gridName,context) {
         var formContext = context;

        console.log('Control ' + gridName);
        console.log('Name of grid' + formContext.getControl(gridName,primaryControl).getName());
       // Xrm.Page.getControl(gridName).getName().refresh();
        formContext.getControl(gridName,primaryControl).refresh();
        

    }
};

что мне не хватает? Любая помощь будет оценена по достоинству.


person yiantheo    schedule 21.01.2021    source источник


Ответы (1)


Поскольку ожидается, что вы передадите context в качестве второго параметра для функции OnSuccess: function (gridName,context), вы должны передать это Applikata.Commands.OnSuccess(gridName, formContext); из места вызова.

ChangeStatusMultiple: function (selectedIds, entityName, status, state, gridName, context) {
        var formContext = context;

        selectedIds.forEach(
            function (id) {
                Applikata.Commands.ChangeStatus(id, entityName, status, state, function () {});
            }
        );
        Applikata.Commands.OnSuccess(gridName, formContext);
    },

    OnSuccess: function (gridName, context) {
         var formContext = context;

        console.log('Control ' + gridName);
        console.log('Name of grid' + formContext.getControl(gridName,primaryControl).getName());
       // Xrm.Page.getControl(gridName).getName().refresh();
        formContext.getControl(gridName,primaryControl).refresh();
        

    }

Или вы также можете установить formContext как глобальную переменную вместо ее инициализации и передачи каждой функции.

person Arun Vinoth    schedule 22.01.2021
comment
хорошо, сделал это, и теперь я получаю следующее: formContext.getControl не является функцией - person yiantheo; 22.01.2021
comment
@yiantheo вы можете отлаживать, поставив точку останова и посмотреть поток - person Arun Vinoth; 22.01.2021
comment
Я так и сделал, все идет нормально до этой строки: console.log ('Имя сетки' + formContext.getControl (gridName, primaryControl) .getName ()); - person yiantheo; 22.01.2021
comment
@yiantheo вы видели, что происходит в переменной контекста? - person Arun Vinoth; 22.01.2021
comment
Удалось пройти через это, и теперь я получаю formContext. GetAttribute не является функцией внутри формы, как только форма загружается - person yiantheo; 25.01.2021
comment
@yiantheo, который, возможно, исходит из какой-то другой функции - person Arun Vinoth; 25.01.2021
comment
Действительно, отсюда: 'function InitSetup (primaryControl) {debugger; var formContext = primaryControl; _isTest = false; _xrmTools = (_isTest)? новый XrmToolkit.Test ([40, 20, 90, 40]): новый XrmToolkit.Common (); formContext.getAttribute (Applikata.Grade.Fields.Exam (true)). addOnChange (CalculateResult); formContext.getAttribute (Applikata.Grade.Fields.CW (true)). addOnChange (CalculateResult); formContext.getAttribute (Applikata.Grade.Fields.Attend (true)). addOnChange (CalculateResult); } ' - person yiantheo; 25.01.2021