Значение элемента управления PCF загружается не всегда; это состояние гонки или что-то еще? Как я могу сказать?

Кто-нибудь еще видел условия гонки в инициализации Power Apps Component Framework (PCF), где значение элемента управления не установлено?

Как мне это проверить?

Я не вижу вызова API при загрузке формы (в UCI)? Я вижу это в пакетном вызове из представления сетки, но это не должно быть?

Вот мой код:

public init(context: ComponentFramework.Context<IInputs>, notifyOutputChanged: () => void, state: ComponentFramework.Dictionary, container: HTMLDivElement) {
        this.context = context;
        this.container = document.createElement("div");
        this.container.setAttribute("class", "acgContainer")
        this._refreshIndex = this.refreshIndex.bind(this);
        this.notifyOutputChanged = notifyOutputChanged;
        this.value = context.parameters.acgAriasYesNoUnControl.raw;
        //console.log("the init value: ", this.value);
        this.options = context.parameters.acgAriasYesNoUnControl.attributes?.Options;
        //console.log(this.options);
        this.selectElement = document.createElement("select");
        this.selectElement.addEventListener('change', this._refreshIndex);
        // @ts-ignore
        var zeroEle = this.selectElement.appendChild(new Option("---", null));
        zeroEle.style.backgroundColor = "#ffffff";
        if (this.options) {
            if (this.options.length > 0) {
                this.options.map((option: ComponentFramework.PropertyHelper.OptionMetadata, index: number) => {
                    var ele = this.selectElement.appendChild(new Option(option.Label, option.Value.toString()));
                    ele.style.backgroundColor = "#ffffff";
                    if (option.Label === this.envYesValue) {
                        //console.log("green option: ", option.Value);
                        this.valueOfYes = option.Value;
                    }
                    if (this.value === option.Value) {
                        ele.dataset.selected = "true";
                    }
                })
            }
        }
        // @ts-ignore
        this.selectElement.value = this.value?.toString() || null;
        this.selectElement.setAttribute("class", "acgYesNoUnControl");
        this.container.appendChild(this.selectElement);
        container.appendChild(this.container);
        //this.notifyOutputChanged();
    }

person Joe Crockett    schedule 25.08.2020    source источник


Ответы (1)


Оказывается, вам нужно установить значение HTMLElement в функции updateView!

Метод init может не устанавливать значение изначально, так как он может не иметь значения с сервера. Но функция updateView запускается каждый раз, когда видит новое значение, и обновляет HTMLElement.

Ссылка, благодаря Диана Б и Грег Херлман

Итак, я должен был выделить функцию updateView:

public updateView(context: ComponentFramework.Context<IInputs>): void {
        this.context = context;
        // storing the latest context from the control.
        // @ts-ignore
        this.selectElement.value = context.parameters.acgAriasYesNoUnControl.raw
            ? context.parameters.acgAriasYesNoUnControl.raw
            : null;
        this.value = context.parameters.acgAriasYesNoUnControl.raw
            ? context.parameters.acgAriasYesNoUnControl.raw
            : null;
        if (this.value === this.valueOfYes) {
            this.selectElement.style.backgroundColor = "#8cbd18";
        } else {
            this.selectElement.style.backgroundColor = "#ffffff";
        }
    }
person Joe Crockett    schedule 26.08.2020
comment
Хм ... наверное, что-то изменилось. Потому что для моего контроля он загружается только при втором вызове updateView. Я вижу, что он не загружен, потому что недокументированное свойство isPropertyLoading имеет значение true внутри context.parameters.FieldValue. Не уверен, что здесь делать. Это раздражает. - person Alex; 16.06.2021