#angular #ionic-framework #enums #angular7 #ionic4
#angular #ionic-framework #перечисления #angular7 #ionic4
Вопрос:
Как добиться двусторонней привязки данных между enum
и ion-select
an?
Пример перечисления;
export enum FooEnum {
Option_1 = 1,
Option_2 = 2,
Option_3 = 3,
Option_4 = 4,
Option_5 = 5,
}
Пример класса компонента;
export class Enums1Page implements OnInit {
public dataVal = FooEnum.Option_4;
get fooEnum() { return FooEnum; }
...
}
Пример шаблона;
<ion-select [(ngModel)]="dataVal">
<ion-select-option *ngFor="let entry of fooEnum | keys" value="{{ entry.key }}">{{ entry.name }}</ion-select-option>
</ion-select>
Обратите внимание, что ion-select-options
приведенные выше списки созданы с использованием пользовательского канала, который отлично работает. Однако фактическая привязка данных к текущему выбранному значению не выполняется.
Я подозреваю, что это связано с тем, что внутренне перечисление вычисляется как целое число, в то время как ключи в ion-select-option
, по-видимому, обрабатываются как строки. Я могу обойти эту проблему с помощью следующего взлома;
Добавлено в мой класс;
get getFooEnum(): string {
return this.dataVal.toString();
}
set getFooEnum(u: string) {
this.dataVal = u;
}
И скорректированы в моем HTML;
<ion-select [(ngModel)]="getFooEnum">
...
</ion-select>
Таким образом, я могу предоставить строковую версию текущего значения Enum, с которым ion-select
собирается выполнить двустороннюю привязку.
Это не оптимально, поскольку требует дополнительного кода для каждого перечисления, которое я хочу использовать.
Есть ли лучший способ, возможно, способ приведения к строке значения перечисления с двусторонней привязкой в шаблоне — или какой-либо способ обрабатывать ion-select-option
значения как целые числа?
Вот весь код, если вы хотите взглянуть глубже;
https://github.com/sygnaltech/ionic4UiPatterns/tree/master/src/app/enums1
ПРИМЕЧАНИЕ: В конечном счете, шаблон является частью приложения CRUD, сосредоточенного на объекте передачи данных. Поле enum будет общедоступным полем внутри этого объекта.
Ответ №1:
попробуйте присвоить свойству значение enum, чтобы оно могло работать
export class Enums1Page implements OnInit {
public dataVal = FooEnum.Option_4;
public fooEnum = FooEnum;
// get fooEnum() { return FooEnum; } <-- this will impact on performance issue too
}
Комментарии:
1. Привет, Шейк, спасибо за совет по производительности, замена
fooEnum
подхода работает нормально, я не уверен, почему в исходном коде, который я нашел, использовался подход свойств, шаблон может так же легко привязываться к полю.2. Однако преобразование
dataVal
в свойство get / set на основе enum не устраняет проблему, это должна быть строка. На самом деле, если я это сделаюdataVal = '4'
, это двустороннее связывание просто отлично, но это больше не перечисление. Мне нужны какие-то другие средства для переноса между string amp; enum или найти какую-то функцию вion-select
, которая позволит привязывать enum в[(ngModel)]