Подтвердить что ты не робот

Angular добавляет странные параметры в элемент выбора при установке значения модели

У меня есть элемент select, определенный как таковой:

<select name="country_id" id="country_id" required="required" ng-model="newAddressForm.country_id">
    <option value="">Select Country</option>
    <option ng-repeat="country in countries" value="{{country.id}}">{{country.name}}</option>
</select>

Все работает отлично, когда я не устанавливаю какое-либо значение в директиве, которая содержит этот элемент select. Но когда я делаю что-то вроде newAddressForm.country_id = 98, вместо выбора опции со значением 98, Angular вводит новый в верхней части элемента select, например:

<option value="? string:98 ?"></option>

Что дает? Какой формат это и почему это происходит? Обратите внимание, что если я делаю console.log(newAddressForm.country_id) в директиве, я получаю нормальный "98", это просто странно в сгенерированном HTML.

Изменить: Обновление ситуации. Переключилось на использование ng-select, но проблема не устранена.

Странный элемент больше не появляется, НО, теперь есть еще один элемент наверху, который имеет только знак вопроса ? в качестве значения и никакой метки.

Вот, из того, что я собрал, Angular "none selected". Я все еще не понимаю, почему он не будет выбирать параметр, который я ему скажу, чтобы выбрать.

Выполнение newAddressForm.country_id = 98 по-прежнему не дает результатов. Почему это?

4b9b3361

Ответ 1

Angular не задает значение элемента выбора фактическим значениям вашего массива и не выполняет некоторые внутренние действия для управления привязкой к сфере. Смотрите первый комментарий Mark Rajcok по этой ссылке:

http://docs.angularjs.org/api/ng.directive:select

Когда пользователь выбирает одну из опций, Angular использует индекс (или ключ) для поиска значения в массиве (или объекте) - это искаженное Значение - это то, для чего установлена ​​модель. (Таким образом, модель не установлена ​​на значение, которое вы видите в HTML! Это вызывает много путаницы.)

Я не уверен, что использование ng-repeat - лучший вариант.

Ответ 2

Используя следующий синтаксис с ng-options, я решил эту проблему для меня:

<select name="country_id" id="country_id" required="required" ng-model="newAddressForm.country_id" ng-options="country.id as country.name for country in countries">
  <option value="">Select Country</option>
</select>

Ответ 3

Если ваши значения являются целыми числами, вы должны использовать "", даже если они не являются строками, эта простая причина - именно то, почему вы получаете опцию с вопросительным знаком в качестве значения.

Вы не должны использовать это:

{ value: 0, name: "Pendiente" },
{ value: 1, name: "Em andamento" },
{ value: 2, name: "Erro" },
{ value: 3, name: "Enviar email" },
{ value: 4, name: "Enviado" }

Это правильный путь:

{ value: "0", name: "Pendiente" },
{ value: "1", name: "Em andamento" },
{ value: "2", name: "Erro" },
{ value: "3", name: "Enviar email" },
{ value: "4", name: "Enviado" }

Если у вас есть хотя бы одна запись, которая не использует "", вы получите это? значение параметра.

Ответ 4

Я столкнулся с этой же проблемой раньше этого вечера, когда увидел, что опция выбора появляется как первая в моем списке, хотя я ее явно не создал. Я заполнил список опций выбора в моем контроллере и использовал тот же синтаксис ng-options, о котором говорилось выше, jessedvrs (кроме того, что я также вставлял опцию "выберите опцию" по умолчанию в контроллере, а не отмечал ее в HTML, как он был).

По какой-то причине в списке выбора всегда будет отображаться дополнительная опция с нулевым индексом со значением "?", но когда я изменил способ заполнения моей опции по умолчанию в контроллере, эта проблема исчезла. Я заполнял опции выбора, создавая вызов API, заполняя их в обещании. Я допустил ошибку, также включив параметр по умолчанию "выберите вариант" в качестве первого, что я сделал в этом обещании, но когда я сделал это вместо обещания (до вызова API), параметры выбора заполняли путь Я ослабил их.

Я думаю, что опция jessedvrs - это одно из решений проблемы (установка параметра по умолчанию в разметке HTML), но если вы предпочитаете заполнять свои параметры в javascript, я бы предложил по-прежнему задавать параметр по умолчанию до совершения каких-либо вызовов к API или процессам, которые все еще могут выполняться во время визуализации HTML.

Ответ 5

Когда вы присваиваете значение некоторому элементу select, AngularJS ищет предоставленное значение в атрибуте value тегов опций в этом элементе select. Но уловка AngularJS делает сравнение на основе типа. Поэтому, если значения в тегах опций являются строками (что обычно имеет место), а переменная, которую вы связываете с помощью ng-model, является числом, AngularJS не находит соответствующий элемент-элемент и, следовательно, создает свой собственный элемент следующим образом:

<option value="? integer:10 ?"></option>

Решение, при привязке себя, преобразует его в соответствующий тип.

В этом случае решением было бы привязать Integer

<select name="country_id" id="country_id" required="required" ng-model="parseInt(newAddressForm.country_id)">
<option value="">Select Country</option>
<option ng-repeat="country in countries" value="{{country.id}}">{{country.name}}</option>
</select>

Если значения заданы как Строки, трюк должен был бы использовать

<select ... ng-model="newAddressForm.country_id.toString()" >

Ответ 6

При нажатии данных на переменную области видимости мы можем использовать следующий код

$scope.enquiryLocationRow.push({'location': EnqLocation.location, 'state_id': Number(EnqLocation.state_id), 'country_id': Number(EnqLocation.country_id)});

он разрешил мою проблему