在设置模型值时,Angular会将奇怪的选项添加到select元素中

我有一个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元素的指令中设置任何types的值。 但是当我做一些像newAddressForm.country_id = 98 ,而不是select值98的选项,Angular注入一个新的select元素的顶部,如下所示:

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

是什么赋予了? 这是什么格式,为什么会发生这种情况? 请注意,如果我在指令中做了一个console.log(newAddressForm.country_id) ,我得到了一个正常的"98" ,这在生成的HTML中很奇怪。

编辑: 情况更新。 切换到使用ng-select ,但问题依然存在。

奇怪的元素不再出现,但是,现在还有另一个元素在顶部,只有一个问号? 作为价值,并没有标签。

就是从我所搜集的Angular的"none selected"选项。 但我仍然不明白为什么它不会select我告诉它select的选项。

newAddressForm.country_id = 98仍然没有结果。 这是为什么?

Angular不会将select元素的值设置为数组的实际值,并执行一些内部操作来pipe理作用域绑定。 请参阅Mark Rajcok在此链接的第一条评论:

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

当用户select其中一个选项时,Angular使用索引(或键)查找数组(或对象)中的值 – 查找的值是模型设置的值。 (所以模型没有设置为你在HTML中看到的值!这会引起很多混淆。)

我不完全确定使用ng-repeat是最好的select。

使用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> 

如果你的值是整数,你应该使用“”,即使它们不是string,这个简单的原因正是你为什么得到一个带有问号的选项。

你不应该使用这个:

 { 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" } 

如果你至less有一个不使用“”的logging,你会得到这个? 期权价值。

今天早上我遇到了同样的问题,在那里我看到一个选项显示为列表中的第一个,尽pipe我没有明确地创build它。 我正在填写我的控制器中的select选项列表,并使用上面提到的jessedvrs相同的ng-options语法(除了我还在控制器中插入了“select一个选项”的默认选项,而不是像HTML那样在HTML中标记它是)。

出于某种原因,select列表将总是在索引零处显示额外的选项,其值为“?”,但是当我改变了我在控制器中填充默认选项的方式时,此问题就消失了。 我正在通过进行API调用来填充select选项,将它们填充到承诺中。 我犯了错误,也填充我默认的“select一个选项”选项作为我在这个承诺中做的第一件事,但是当我做了这个而不是承诺之外 (在进行API调用之前),select选项填充方式我放弃了。

我认为jessedvrs选项是解决这个问题的一种方法(在HTML标记中设置默认选项),但是如果你喜欢在javascript中填充选项,我会build议在对API进行任何调用之前仍然设置默认选项或者在呈现HTML时仍然可能正在运行的进程。

当你给一个select元素赋值的时候,AngularJS会在select元素中的选项标签的value属性中寻找提供的值。 但是值得注意的是, AngularJS是基于types的比较 。 因此,如果选项标签中的值是string(通常是这种情况),并且使用ng-model绑定的variables是一个数字,那么AngularJS将无法find匹配的选项元素,从而创build自己的元素 –

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

解决scheme是,绑定本身,将其转换为适当的types。

在这种情况下,解决方法是绑定一个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> 

如果这些值被设置为string,诀窍就是使用

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

在范围variables上推送数据时,我们可以使用下面的代码

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

它解决了我的问题