#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. Значение поля. Не уверен, что здесь делать. Это раздражает.