如何在AngularJS的ng-options中设置value属性?

Juk*_*nen 551 javascript angularjs

这似乎困扰了很多人(包括我).

ng-options在AngularJS中使用指令来填充<select>标记的选项时,我无法弄清楚如何设置选项的值.这方面的文档真的不清楚 - 至少对像我这样的傻瓜来说.

我可以像这样轻松设置选项的文本:

ng-options="select p.text for p in resultOptions"
Run Code Online (Sandbox Code Playgroud)

resultOptions例如为:

[
    {
        "value": 1,
        "text": "1st"
    },
    {
        "value": 2,
        "text": "2nd"
    }
]
Run Code Online (Sandbox Code Playgroud)

它应该(并且可能是)设置选项值最简单的事情,但到目前为止我还没有得到它.

Umu*_*acı 689

请参阅ngOptions

ngOptions(可选) - { comprehension_expression=} - 采用以下形式之一:

对于数组数据源: label for value in array select as label for value in array label group by group for value in array select as label group by group for value in array track by trackexpr 对于对象数据源: label for (key , value) in object select as label for (key , value) in object label group by group for (key, value) in object select as label group by group for (key, value) in object

在你的情况下,它应该是

array = [{ "value": 1, "text": "1st" }, { "value": 2, "text": "2nd" }];

<select ng-options="obj.value as obj.text for obj in array"></select>
Run Code Online (Sandbox Code Playgroud)

更新

通过AngularJS上的更新,现在可以使用表达式设置元素value属性的实际值.selecttrack by

<select ng-options="obj.text for obj in array track by obj.value">
</select>
Run Code Online (Sandbox Code Playgroud)

如何记住这些丑陋的东西

对于所有难以记住这种语法形式的人:我同意这不是最简单或最美妙的语法.这种语法是Python列表推导的扩展版本,并且知道这有助于我非常容易地记住语法.它是这样的:

Python代码:

my_list = [x**2 for x in [1, 2, 3, 4, 5]]
> [1, 4, 9, 16, 25]

# Let people to be a list of person instances
my_list2 = [person.name for person in people]
> my_list2 = ['Alice', 'Bob']
Run Code Online (Sandbox Code Playgroud)

这实际上与上面列出的第一个语法相同.但是,<select>我们通常需要区分代码中的实际值和<select>元素中显示的文本(标签).

比如,我们需要person.id在代码中,但我们不想向id用户显示; 我们想要显示它的名字.同样,我们person.name对代码不感兴趣.as标签上有关键字.所以它变成这样:

person.id as person.name for person in people
Run Code Online (Sandbox Code Playgroud)

或者,而不是person.id我们可能需要person实例/引用本身.见下文:

person as person.name for person in people
Run Code Online (Sandbox Code Playgroud)

对于JavaScript对象,也适用相同的方法.请记住,对象中的项目是(key, value)成对解构的.

  • 奇怪但我在Chrome和FF中得到<option value ="0">第一个</ option>,<option value ="1"> 2nd </ option>. (57认同)
  • 这不是错误,它是一个功能.angularjs在内部处理ngOptions和ngModel,这样它允许您在选项中使用任何类型的对象作为值,而不仅仅是字符串.你永远不应该试图获得select*的价值*你需要使用附加到select元素的ngModel. (49认同)
  • 您的示例未填充选项的值属性.它定义了将存储在<select>元素模型中的内容.请参阅[obj.value as obj.text](http://jsfiddle.net/3y5Pw/)和[obj.text](http://jsfiddle.net/LPtcn/1/)之间的区别 (33认同)
  • 我不敢苟同.在内部,select指令可以轻松使用自己的隐形模型来跟踪选择的选项.即使它没有在内部跟踪模型值,它至少可以呈现选项,只是前置并选择空选项(如果您将模型设置为不在选项集中的值,那么它就是现在的行为) .显示选项的唯一依赖是选项本身 - POLA原则适用于此处. (4认同)
  • 当答案没有提供答案时,为什么这个答案有这么多的票?frm.adiputra的回答是正确的. (3认同)
  • 这个答案今天不起作用,角度为1.2.15 (2认同)

小智 135

值属性如何获得其值:

  • 当使用数组作为数据源时,它将是每次迭代中数组元素的索引;
  • 使用对象作为数据源时,它将是每次迭代中的属性名称.

所以在你的情况下它应该是:

obj = { '1': '1st', '2': '2nd' };

<select ng-options="k as v for (k,v) in obj"></select>
Run Code Online (Sandbox Code Playgroud)

  • +1用于解释Angular如何设置选项元素的value属性. (15认同)
  • @Trip,如果你'检查'选择选项,你会看到数字,但是如果你看一下模型中的绑定值,那么这个值就是'k'值.这令人困惑.blesh有一个插件,在这个答案中显示了这一点:http://stackoverflow.com/questions/13047923/working-with-ng-options-in-angular http://plnkr.co/edit/vJOljg?p =preview (13认同)
  • 这应该包含在角度文件中,简短而精确.+1 (4认同)
  • 这不会设置值。值默认为数字。但你实际上不能指定一个“值”..荒谬.. (2认同)
  • 这是唯一对我有用的解决方案.多么令人讨厌的头痛. (2认同)

小智 121

我也有这个问题.我无法在ng-options中设置我的值.生成的每个选项都设置为0,1,...,n.

为了使它正确,我在ng-options中做了类似的事情:

HTML:

<select ng-options="room.name for room in Rooms track by room.price">
    <option value="">--Rooms--</option>
</select>
Run Code Online (Sandbox Code Playgroud)

我使用"track by"来设置我的所有值room.price.

(这个例子很糟糕:因为如果有多个价格相等,代码就会失败.所以要确保有不同的价值.)

JSON:

$scope.Rooms = [
            { name: 'SALA01', price: 100 },
            { name: 'SALA02', price: 200 },
            { name: 'SALA03', price: 300 }
        ];
Run Code Online (Sandbox Code Playgroud)

我从博文中了解到如何使用Angular.JS ng-options&track by设置选择元素的初始选定值.

观看视频.这是一个很好的课程:)

  • 对于**选项框的值来匹配数组/对象的ng-options,这是最合适的答案.如果有奖励兑换系统,我会为你节省**10000点**以节省每个人的一天.来自角度团队的最奇怪的语法. (9认同)
  • 这非常有效.最重要的是,它允许使用带有<select>的datalist元素,以便datalist可以通过它们的值引用选项.谢谢@Bruno Gomes (8认同)
  • 这是唯一适合我的解决方案.谢谢. (3认同)
  • 谢谢!很长一段时间这令人沮丧! (2认同)
  • 我希望房间的价格永远不会相同,因为这会打破. (2认同)
  • 这应该是答案的最佳答案,因为这是唯一对我有用的解决方案.实际上,在AngularJS中,你不必担心值是什么,即0,1,2(默认情况下是这样),因为你可以将整个对象作为值.请参阅此答案http://stackoverflow.com/questions/12139152/how-to-set-value-property-in-angularjs-ng-options#29005692 (2认同)
  • 对于这个特定问题,这是一个更好的答案,但是每个人都会对复制/粘贴文档进行投票 (2认同)

nee*_*mzy 47

如果要更改option元素的值,因为表单最终会提交给服务器,而不是这样做,

<select name="text" ng-model="text" ng-options="select p.text for p in resultOptions"></select>
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

<select ng-model="text" ng-options="select p.text for p in resultOptions"></select>
<input type="hidden" name="text" value="{{ text }}" />
Run Code Online (Sandbox Code Playgroud)

然后,预期值将通过表格以正确的名称发送.

  • 我想补充一点,而不是使用`<input type ="hidden"name ="text"value ="{{text}}"/>`,我会使用`ng-value`.所以:`<input type ="hidden"name ="text"ng-value ="{{text}}"/>`. (2认同)

Phi*_*ley 26

my_hero使用普通表单提交将调用的自定义值发送到服务器:

JSON:

"heroes": [
  {"id":"iron", "label":"Iron Man Rocks!"},
  {"id":"super", "label":"Superman Rocks!"}
]
Run Code Online (Sandbox Code Playgroud)

HTML:

<select ng-model="hero" ng-options="obj.id as obj.label for obj in heroes"></select>
<input type="hidden" name="my_hero" value="{{hero}}" />
Run Code Online (Sandbox Code Playgroud)

服务器将接收ironsuper作为其值my_hero.

这类似于@neemzy的答案,但为value属性指定了单独的数据.


Jos*_*des 24

看起来使用起来ng-options很复杂(可能令人沮丧),但实际上我们遇到了架构问题.

AngularJS充当动态HTML + JavaScript应用程序的MVC框架.虽然它的(V)iew组件确实提供HTML"模板化",但其主要目的是通过控制器将用户操作连接到模型中的更改.因此,在AngularJS中工作的适当抽象级别是select元素将模型中的值设置为查询中的值.

  • 查询行如何呈现给用户的是(V)电子情报的关注和ng-options提供的for支配选项元素的内容应该是什么样的关键字 p.text for p in resultOptions.
  • 如何将选定的行呈现给服务器是(M)odel的关注点.因此,ng-options提供as关键字以指定为模型提供的值,如k as v for (k,v) in objects.

这个问题的正确解决方案当然是体系结构,并涉及重构HTML,以便(M)odel在需要时执行服务器通信(而不是用户提交表单).

如果MVC HTML页面对于手头的问题不必要过度设计:那么只使用AngularJS的(V)iew组件的HTML生成部分.在这种情况下,遵循用于生成元素的相同模式,例如&lt;li /&gt;'s下的&lt;ul /&gt;'s并在选项元素上放置ng-repeat:

<select name=“value”>
    <option ng-repeat=“value in Model.Values” value=“{{value.value}}”>
        {{value.text}}
    </option>
</select>
Run Code Online (Sandbox Code Playgroud)

作为kludge,可以随时将select元素的name属性移动到隐藏的input元素:

<select ng-model=“selectedValue” ng-options=“value.text for value in Model.Values”>
</select>
<input type=“hidden” name=“value” value=“{{selectedValue}}” />
Run Code Online (Sandbox Code Playgroud)

  • 这就是它在AngularJS网站上所说的内容:https://docs.angularjs.org/api/ng/directive/select.```注意:ngOptions为<option>元素提供了一个迭代器工具,当你想要将select模型绑定到非字符串值时,应该使用它来代替ngRepeat.这是因为一个option元素只能被绑定目前字符串值."```.没有提到性能,只是ngOptions是ngRepeat的替代品. (2认同)

Lik*_*iko 20

你可以这样做:

<select ng-model="model">
    <option value="">Select</option>
    <option ng-repeat="obj in array" value="{{obj.id}}">{{obj.name}}</option>
</select>
Run Code Online (Sandbox Code Playgroud)

- 更新

经过一些更新后,用户frm.adiputra的解决方案要好得多.码:

obj = { '1': '1st', '2': '2nd' };
<select ng-options="k as v for (k,v) in obj"></select>
Run Code Online (Sandbox Code Playgroud)

  • 最好在select元素/指令中使用ng-options.例如,<select ng-model ="model"ng-options ="obj.id as obj.name for obj in array">.你有什么工作,但它不适用于其他Angular结构.例如,此ng-click不适用于您的代码:<a ng-click="model=1">选择1 </a>,但如果使用ng-options,它确实有效. (8认同)
  • 这个答案错了​​!你应该使用ng-options (7认同)

Jef*_*hin 14

今天我一直在努力解决这个问题.我通读了AngularJS文档,本文和其他帖子以及他们引导的一些博客.他们都帮助我克服了更精细的细节,但最终这似乎是一个令人困惑的话题.主要是因为有许多语法上的细微差别ng-options.

最后,对我来说,更少的是它.

给定范围配置如下:

        //Data used to populate the dropdown list
        $scope.list = [
           {"FirmnessID":1,"Description":"Soft","Value":1},         
           {"FirmnessID":2,"Description":"Medium-Soft","Value":2},
           {"FirmnessID":3,"Description":"Medium","Value":3}, 
           {"FirmnessID":4,"Description":"Firm","Value":4},     
           {"FirmnessID":5,"Description":"Very Firm","Value":5}];

        //A record or row of data that is to be save to our data store.
        //FirmnessID is a foreign key to the list specified above.
        $scope.rec = {
           "id": 1,
           "FirmnessID": 2
        };
Run Code Online (Sandbox Code Playgroud)

这就是我获得所需结果所需的全部内容:

        <select ng-model="rec.FirmnessID"
                ng-options="g.FirmnessID as g.Description for g in list">
            <option></option>
        </select>   
Run Code Online (Sandbox Code Playgroud)

注意我没用track by.使用track by所选项目将始终返回与FirmnessID匹配的对象,而不是FirmnessID本身.这现在符合我的标准,即它应该返回一个数值而不是对象,并用于ng-options通过不为生成的每个选项创建新范围来获得它提供的性能改进.

另外,我所需要的空白第一行,所以简单地加入<option><select>元件.

这是一个展示我作品的Plunkr.


Kth*_*rog 11

如果您希望值与文本相同,则可以使用数组执行此操作,而不是使用新的"跟踪依据"功能:

<select ng-options="v as v for (k,v) in Array/Obj"></select>
Run Code Online (Sandbox Code Playgroud)

注意标准语法之间的区别,它将使值成为Object/Array的键,因此数组为0,1,2等:

<select ng-options"k as v for (k,v) in Array/Obj"></select>
Run Code Online (Sandbox Code Playgroud)

k作为v变为v为v.

我发现这只是基于常识来看语法.(k,v)是将数组/对象拆分为键值对的实际语句.

在'k as v'语句中,k将是值,v将是显示给用户的文本选项.我认为'追踪'是凌乱和矫枉过正的.


blu*_*lue 11

根据我的说法,这最适合所有场景:

<select ng-model="mySelection.value">
   <option ng-repeat="r in myList" value="{{r.Id}}" ng-selected="mySelection.value == r.Id">{{r.Name}}
   </option>
</select>
Run Code Online (Sandbox Code Playgroud)

您可以在哪里使用模型来绑定数据.您将获得对象将包含的值以及基于您的方案的默认选择.


Arc*_*hna 9

这就是我解决这个问题的方法.我跟踪了select by value并在JavaScript代码中将所选的item属性设置为模型.

Countries =
[
    {
        CountryId = 1, Code = 'USA', CountryName = 'United States of America'
    },
    {
       CountryId = 2, Code = 'CAN', CountryName = 'Canada'
    }
]
Run Code Online (Sandbox Code Playgroud)
<select ng-model="vm.Enterprise.AdminCountry" ng-options="country.CountryName for country in vm.Countries track by country.CountryId">
Run Code Online (Sandbox Code Playgroud)

vm是我的控制器和从服务中检索到的控制器中的国家/地区{CountryId =1, Code = 'USA', CountryName='United States of America'}.

当我从选择下拉列表中选择另一个国家/地区并使用"保存"发布我的页面时,我得到了正确的国家/地区.


tim*_*per 8

ng-options指令不对<options>数组的元素设置value属性:

使用limit.value as limit.text for limit in limits方式:

设置<option>标签为limit.text
limit.value值保存到选择中ng-model

请参阅Stack Overflow问题AngularJS ng-options不呈现值.


Wes*_*ary 6

可以使用 ng-options 实现 select 标签绑定到 value 和 display 成员

使用此数据源时

countries : [
              {
                 "key": 1,
                 "name": "UAE"
             },
              {
                  "key": 2,
                  "name": "India"
              },
              {
                  "key": 3,
                  "name": "OMAN"
              }
         ]
Run Code Online (Sandbox Code Playgroud)

您可以使用下面的将您的选择标签绑定到值和名称

<select name="text" ng-model="name" ng-options="c.key as c.name for c in countries"></select>
Run Code Online (Sandbox Code Playgroud)

效果很好


Anj*_*ova 5

<select ng-model="color" ng-options="(c.name+' '+c.shade) for c in colors"></select><br>
Run Code Online (Sandbox Code Playgroud)