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

#powerapps-component-framework

#powerapps-component-framework

Вопрос:

Кто-нибудь еще видел условия гонки при инициализации платформы компонентов Power Apps (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();
    }
  

Ответ №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";
        }
    }
  

Комментарии:

1. Хм … что-то изменилось, я думаю. Потому что для моего элемента управления он загружается только при 2-м вызове «UpdateView». Я вижу, что оно не загружено, потому что для недокументированного свойства с именем «isPropertyLoading» установлено значение «true» внутри context.parameters. Значение поля. Не уверен, что здесь делать. Это раздражает.