Постоянство опции в памяти
Когда значение <option>
назначено [ngValue]="value"
, значение сохраняется в свойстве
_optionMap: Map<string, any>
, где ключ - индекс опциона. Поэтому, если у вас есть это, выберите:
<select>
<option [value]="10"></option>
<option [ngValue]="20"></option>
<option [value]="30"></option>
<option [ngValue]="40"></option>
</select>
У вас будет _optionMap
из:
[ "1", 20 ],
[ "3", 40 ]
Сохранение параметра в HTML
Эти параметры сохраняются в значении HTML как value="{index}: {value}"
.
Параметры, заданные с помощью [value]
, сохраняются в HTML в виде простых строковых значений.
Поиск выбранной опции
При извлечении значения значение HTML делится на :
, и бит перед двоеточием используется в качестве ключа для извлечения возможных значений из _optionMap
.
Так что если у вас есть следующее HTML:
<option [ngValue]="null"></option>
<option [value]="0"></option>
_optionMap
будет выглядеть следующим образом:
["0", null]
И значение 0
будет рассматриваться как ключ "0"
, для значение null
будет найдено на карте.
Заключение
Безопаснее выбрать один из [ngValue]
или [value]
для работы в любом заданном <select>
. Особенно, если у вас есть цифры c.
Документы в лучшем случае неоднозначны, когда речь идет об указании обстоятельств, при которых следует использовать входные данные.
@ Input () ngValue: любой Отслеживает значение, связанное с элементом option. В отличие от привязки значения, ngValue поддерживает привязку к объектам.
@ Input () value: любая Отслеживает простые строковые значения, связанные с элементом option. Для объектов используйте привязку ввода ngValue.
Они подразумевают, что вы можете смешивать и сопоставлять входы в пределах одного <select>
, не задумываясь об этом. Если у вас [value]="someNumber"
, у вас могут возникнуть проблемы при объединении с [ngValue]
.
. В приведенном ниже примере никогда не будут выбраны значения 0
или 2
, поскольку они конфликтуют с * 1067. * indexes:
<select [(ngModel)]="model" (ngModelChange)="onModelChange()">
<option [ngValue]="10">10</option>
<option [value]="0">0</option>
<option [ngValue]="20">20</option>
<option [value]="2">2</option>
</select>
DEMO
Я понял это, создав игровую площадку с раздвоенной версией ngValue
: https://stackblitz.com/edit/angular-hzx7cj
ngValue
исходный код: https://github.com/angular/angular/blob/master/packages/forms/src/directives/select_control_value_accessor.ts