【问题标题】:How do I set the value property in AngularJS' ng-options?如何在 AngularJS 的 ng-options 中设置 value 属性?
【发布时间】:2012-08-21 18:34:43
【问题描述】:

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

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

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

ng-options="select p.text for p in resultOptions"

resultOptions 例如:

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

设置选项值应该是(并且可能是)最简单的事情,但到目前为止我还是不明白。

【问题讨论】:

  • 遇到了同样的问题,因为我发现文档(如下图)不是很清楚。
  • 问题中描述的“select”的使用本质上是错误的,因为在这种情况下,“select”不是关键字,而是表达式的占位符。这来自 AngularJS 的文档:“选择:此表达式的结果将绑定到父元素的模型。如果未指定,则选择表达式将默认为值。”我在下面的回答中提供了更多详细信息。
  • 对我来说这是最好的答案。 stackoverflow.com/questions/12139152/…
  • 注意:要使 ng-options 起作用,ng-model 是强制性的!!!!!!!!!!!!参考:stackoverflow.com/a/13049740/234110

标签: javascript angularjs


【解决方案1】:

ngOptions

ngOptions(optional) – {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>

更新

随着 AngularJS 的更新,现在可以使用 track by 表达式为 select 元素的 value 属性设置实际值。

<select ng-options="obj.text for obj in array track by obj.value">
</select>

如何记住这些丑陋的东西

致所有难以记住这种语法形式的人:我同意这不是最简单或最漂亮的语法。这种语法是 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']

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

例如,我们在代码中需要person.id,但我们不想向用户显示id;我们想显示它的名字。同样,我们对代码中的person.name 不感兴趣。有 as 关键字来标记东西。于是就变成了这样:

person.id as person.name for person in people

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

person as person.name for person in people

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

【讨论】:

  • 您的示例未填充选项的值属性。它定义了将存储在
  • 奇怪,但我在 Chrome 和 FF 中得到
  • 这不是错误,而是一项功能。 angularjs 在内部处理 ngOptions 和 ngModel,这样它允许您使用任何类型的对象作为选项中的值,而不仅仅是字符串。您永远不应该尝试获取选择的值相反您只需要使用附加到选择元素的ngModel。
  • 我不同意。在内部,select 指令可以很容易地使用它自己的不可见模型来跟踪选择了哪个选项。即使它没有在内部跟踪模型值,它至少可以呈现选项并只是预先选择并选择空选项(如果您将模型设置为不在选项集中的值,这是现在的行为) .显示选项的唯一依赖是选项本身——这里适用 POLA 原则。
  • 为什么这个答案没有提供答案时有这么多赞成票? frm.adiputra 的回答是正确的。
【解决方案2】:

值属性如何获取其值:

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

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

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

<select ng-options="k as v for (k,v) in obj"></select>

【讨论】:

  • +1 用于解释 Angular 如何设置选项元素的 value 属性。
  • 这不会设置值。值默认为数字。但你实际上不能指定一个“价值”..可笑的..
  • @Trip,如果您“检查”选择选项,您会看到数字,但如果您查看模型中的绑定值,在这种情况下,该值是“k”值。这很令人困惑。 blesh 在这个答案中显示了这一点:stackoverflow.com/questions/13047923/…plnkr.co/edit/vJOljg?p=preview
  • 这应该包含在角度文档中,简短而准确。 +1
  • 这是唯一对我有用的解决方案。多么令人讨厌的头痛。
【解决方案3】:

我也有这个问题。我无法在 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>

我使用“track by”将我的所有值设置为room.price

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

JSON:

$scope.Rooms = [
            { name: 'SALA01', price: 100 },
            { name: 'SALA02', price: 200 },
            { name: 'SALA03', price: 300 }
        ];

我是从博文中了解到的How to set the initial selected value of a select element using Angular.JS ng-options & track by

观看视频。这是一堂很好的课:)

【讨论】:

  • 这非常有效。最重要的是,它允许使用包含
  • 这是唯一适合我的解决方案。谢谢。
  • 这是 ng-options 的 最合适的答案,该选项框的值与数组/对象匹配。如果有奖励交换系统,我会为您节省每个人的一天,我会为您提供 10000 积分。来自 Angular 团队的最奇怪的语法。
  • 谢谢!这真是令人沮丧很长一段时间!
  • 我希望房价永远不会一样,因为那样就坏了。
【解决方案4】:

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

<select name="text" ng-model="text" ng-options="select p.text for p in resultOptions"></select>

你可以这样做:

<select ng-model="text" ng-options="select p.text for p in resultOptions"></select>
<input type="hidden" name="text" value="{{ text }}" />

然后将通过正确名称的表单发送预期值。

【讨论】:

  • 我要补充一点,而不是使用&lt;input type="hidden" name="text" value="{{ text }}" /&gt;,我会使用ng-value。所以:&lt;input type="hidden" name="text" ng-value="{{ text }}" /&gt;.
  • 在我的情况下澄清一下,我没有使用 json post 通过 Angular 提交表单——而是我通常使用 http post 提交表单,因此覆盖 Angular 在 标签允许我提交正确的值(谢谢!)。我不需要在隐藏输入中使用 ng-value,而是需要将 value 标签设置为原始帖子注释。
【解决方案5】:

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

JSON:

"heroes": [
  {"id":"iron", "label":"Iron Man Rocks!"},
  {"id":"super", "label":"Superman Rocks!"}
]

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

服务器将接收ironsuper 作为my_hero 的值。

这类似于the answer by @neemzy,但为value 属性指定单独的数据。

【讨论】:

    【解决方案6】:

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

    AngularJS 用作动态 HTML+JavaScript 应用程序的 MVC 框架。虽然它的 (V)iew 组件确实提供了 HTML“模板”,但它的主要目的是通过控制器将用户操作与模型中的更改联系起来。因此在 AngularJS 中工作的适当抽象级别是选择元素将模型中的值设置为查询中的值

    • 查询行如何呈现给用户是 (V)iew 关心的问题,ng-options 提供了 for 关键字来指示选项元素的内容应该是什么ie @987654326 @。
    • 如何将选定的行呈现给服务器是 (M) 模型的关注点。因此ng-options 提供了as 关键字来指定提供给模型的值,如k as v for (k,v) in objects

    这个问题的正确解决方案本质上是架构性的,涉及重构您的 HTML,以便 (M) 模型在需要时执行服务器通信(而不是用户提交表单)。

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

    <select name=“value”>
        <option ng-repeat=“value in Model.Values” value=“{{value.value}}”>
            {{value.text}}
        </option>
    </select>
    

    作为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}}” />
    

    【讨论】:

    • 在选项元素上使用 ng-repeat 时性能不佳,可能吗?您应该在选择本身上使用 ng-options。
    • @DrCord:在选项元素上使用 ng-repeat 仅在个别情况下作为解决方案提供(当适当的 MVC HTML 页面是不必要的过度工程时)。也许downvoter没有准备好。将对其进行编辑以更明确地指出选项元素上的 ng-repeat 不是理想情况。
    • 作为 Angular N00b,我会选择这个解决方案,因为首先它看起来像是一个公平的建议并且可能会起作用。至少可以说,其他答案中建议的语法很奇怪-即使许多选择之一恰好起作用。这是一个合法的解决方案,如果它避免了过早的优化,那就没问题了。投反对票只是表面上的意思。
    • 这是 AngularJS 网站上所说的:docs.angularjs.org/api/ng/directive/select"Note: ngOptions provides an iterator facility for the &lt;option&gt; element which should be used instead of ngRepeat when you want the select model to be bound to a non-string value. This is because an option element can only be bound to string values at present."。没有提到性能,只是说 ngOptions 是 ngRepeat 的替代品。
    • @IanLewis,谢谢,这是有道理的。为什么 ngRepeat 在未绑定选择的选项上的性能比在
    • 标记上的性能低,对我来说没有任何意义。
    【解决方案7】:

    你可以这样做:

    <select ng-model="model">
        <option value="">Select</option>
        <option ng-repeat="obj in array" value="{{obj.id}}">{{obj.name}}</option>
    </select>
    

    -- 更新

    经过一些更新,user frm.adiputra's solution 好多了。代码:

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

    【讨论】:

    • 最好在选择元素/指令中使用 ng-options。例如,
    • 我只是因为这样做而出现了一个奇怪的错误。大量痛苦的搜索使我发现了 ng-options,并且该错误消失了。 ng-model 似乎要求选项的 value 属性是数字的,并且从 0 开始递增。如果使用 ng-repeat 和
    【解决方案8】:

    今天我已经为这个问题苦苦挣扎了一段时间。我通读了 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
            };
    

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

            <select ng-model="rec.FirmnessID"
                    ng-options="g.FirmnessID as g.Description for g in list">
                <option></option>
            </select>   
    

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

    另外,我需要第一行空白,所以我只是在&lt;select&gt; 元素中添加了一个&lt;option&gt;

    这是一个Plunkr,展示了我的工作。

    【讨论】:

    • 传奇。这正是我所需要的。谢谢你
    • 很好,但是“值”键的用途是什么?它们似乎没有必要。
    • 与示例无关。它们只是我的客户提供给我的原始数据的一部分。
    【解决方案9】:

    如果您希望值与文本相同,您可以简单地使用数组来执行此操作,而不是使用新的“track by”功能:

    <select ng-options="v as v for (k,v) in Array/Obj"></select>
    

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

    <select ng-options"k as v for (k,v) in Array/Obj"></select>
    

    k as v 变成 v as v

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

    在“k as v”语句中,k 是值,v 是显示给用户的文本选项。我认为“track by”是混乱和矫枉过正的。

    【讨论】:

    • 哇?适用于我页面上所有位置的数组,我们使用的是相同版本的 AngularJS 吗?
    【解决方案10】:

    在我看来,这最适合所有场景:

    <select ng-model="mySelection.value">
       <option ng-repeat="r in myList" value="{{r.Id}}" ng-selected="mySelection.value == r.Id">{{r.Name}}
       </option>
    </select>
    

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

    【讨论】:

    • 喜欢这个解决方案。他们对该指令的角度助手不必要地复杂。感谢您自称使用情况的判断者。
    【解决方案11】:

    这就是我解决这个问题的方法。我跟踪了按值选择并在我的 JavaScript 代码中将选定项属性设置为模型。

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

    vm 是我的控制器,从服务中检索到的控制器中的 Country 是 {CountryId =1, Code = 'USA', CountryName='United States of America'}

    当我从选择下拉列表中选择另一个国家并使用“保存”发布我的页面时,我得到了正确的国家绑定。

    【讨论】:

      【解决方案12】:

      ng-options 指令未在数组的 &lt;options&gt; 元素上设置 value 属性:

      使用limit.value as limit.text for limit in limits 表示:

      &lt;option&gt;的标签设置为limit.text
      limit.value 值保存到选择的ng-model

      查看堆栈溢出问题AngularJS ng-options not rendering values

      【讨论】:

        【解决方案13】:

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

        使用此数据源时

        countries : [
                      {
                         "key": 1,
                         "name": "UAE"
                     },
                      {
                          "key": 2,
                          "name": "India"
                      },
                      {
                          "key": 3,
                          "name": "OMAN"
                      }
                 ]
        

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

        <select name="text" ng-model="name" ng-options="c.key as c.name for c in countries"></select>
        

        效果很好

        【讨论】:

        • 请用一些解释来扩充您的纯代码答案,以避免误解 StackOverflow 是免费的代码编写服务。
        【解决方案14】:
        <select ng-model="color" ng-options="(c.name+' '+c.shade) for c in colors"></select><br>
        

        【讨论】:

          【解决方案15】:

          问题发布一年后,我不得不为这个问题找到答案,因为这些都没有给出实际答案,至少对我来说是这样。

          你问过如何选择选项,但没人说这两件事是一样的:

          如果我们有这样的选择:

          $scope.options = [
              { label: 'one', value: 1 },
              { label: 'two', value: 2 }
            ];
          

          我们尝试像这样设置一个默认选项:

          $scope.incorrectlySelected = { label: 'two', value: 2 };
          

          它会工作,但如果你尝试选择这样的选项:

          $scope.correctlySelected = $scope.options[1];
          

          它会工作

          即使这两个对象具有相同的属性,AngularJS 仍将它们视为不同的,因为 AngularJS 通过 reference 进行比较。

          看看小提琴http://jsfiddle.net/qWzTb/

          【讨论】:

            【解决方案16】:

            这个问题的正确答案是provided by user frm.adiputra,因为目前这似乎是显式控制选项元素的 value 属性的唯一方法。

            但是,我只是想强调一下,“select”在这种情况下不是关键字,而只是表达式的占位符。关于“select”表达式的定义以及其他可以在 ng-options 指令中使用的表达式,请参考下面的列表。

            问题中描述的 select 的使用:

            ng-options='select p.text for p  in resultOptions'
            

            本质上是错误的。

            根据表达式列表,当在对象数组中给出选项时,似乎可以使用 trackexpr 来指定值,但它仅用于分组。 p>


            来自 AngularJS 的 ng-options 文档:

            • 数组/对象:计算结果为数组/对象的表达式 迭代。
            • value:局部变量,将引用其中的每个项目 迭代过程中对象的数组或每个属性值。
            • key:局部变量,在执行期间将引用对象中的属性名称 迭代。
            • label:这个表达式的结果将是标签 元素。该表达式很可能会引用该值 变量(例如 value.propertyName)。
            • select:此表达式的结果将绑定到父元素的模型。 如果未指定,则选择表达式将默认为值。
            • group:此表达式的结果将用于使用 DOM 对选项进行分组 元素。
            • trackexpr:在处理对象数组时使用。将使用此表达式的结果 来识别数组中的对象。 trackexpr 很可能是指 值变量(例如 value.propertyName)。

            【讨论】:

              【解决方案17】:

              根据您设置数据源的方式,在 ng-options 中选择一个项目可能会有些棘手。

              在与他们斗争了一段时间后,我最终用我使用的最常见的数据源制作了一个样本。你可以在这里找到它:

              http://plnkr.co/edit/fGq2PM?p=preview

              现在要让 ng-options 工作,这里有一些事情需要考虑:

              1. 通常您从一个来源获得选项,从另一个来源获得选定的值。例如:
                • states :: ng-options 的数据
                • user.state :: 设置为选中的选项
              2. 基于 1,最简单/合乎逻辑的做法是用一个源填充选择,然后通过代码设置选择的值。获得混合数据集通常会更好。
              3. AngularJS 允许选择控件容纳超过key | label。许多在线示例将对象作为“键”,如果您需要来自对象的信息,请按此方式设置,否则使用您需要的特定属性作为键。 (ID、CODE 等。如 plkr 示例)
              4. 设置下拉/选择控件值的方式取决于#3,

                • 如果下拉键是单个属性(就像 plunkr 中的所有示例一样),您只需设置它,例如: $scope.dropdownmodel = $scope.user.state;
                • 如果将对象设置为键,则需要循环通过选项,即使分配对象也不会将项目设置为选中,因为它们将具有不同的哈希键,例如:

                  for (var i = 0, len = $scope.options.length; i < len; i++) {
                    if ($scope.options[i].id == savedValue) { // Your own property here:
                      console.log('Found target! ');
                      $scope.value = $scope.options[i];
                      break;
                    }
                  }
                  

              您可以替换另一个对象 $scope.myObject.myProperty 中相同属性的 savedValue。

              【讨论】:

              • 多年后,我感谢您提供 plunker 样本。非常有用。
              【解决方案18】:

              对我来说the answer by Bruno Gomes 是最好的答案。

              但实际上,您不必担心设置选择选项的 value 属性。 AngularJS 会解决这个问题。让我详细解释一下。

              Please consider this fiddle

              angular.module('mySettings', []).controller('appSettingsCtrl', function ($scope) {
              
                  $scope.timeFormatTemplates = [{
                      label: "Seconds",
                      value: 'ss'
                  }, {
                      label: "Minutes",
                      value: 'mm'
                  }, {
                      label: "Hours",
                      value: 'hh'
                  }];
              
              
                  $scope.inactivity_settings = {
                      status: false,
                      inactive_time: 60 * 5 * 3, // 15 min (default value), that is, 900 seconds
                      //time_format: 'ss', // Second (default value)
                      time_format: $scope.timeFormatTemplates[0], // Default seconds object
                  };
              
                  $scope.activity_settings = {
                      status: false,
                      active_time: 60 * 5 * 3, // 15 min (default value), that is,  900 seconds
                      //time_format: 'ss', // Second (default value)
                      time_format: $scope.timeFormatTemplates[0], // Default seconds object
                  };
              
                  $scope.changedTimeFormat = function (time_format) {
                      'use strict';
              
                      console.log('time changed');
                      console.log(time_format);
                      var newValue = time_format.value;
              
                      // do your update settings stuffs
                  }
              });
              

              正如您在小提琴输出中看到的那样,无论您为选择框选项选择什么,它都是您的自定义值,或者 AngularJS 自动生成的 0、1、2 值,除非您使用jQuery 或任何其他库来访问该选择组合框选项的值并相应地对其进行操作。

              【讨论】:

                【解决方案19】:

                请使用按属性区分选择框中的值和标签。

                请尝试

                <select ng-options="obj.text for obj in array track by obj.value"></select>
                

                这将分配带有文本的标签和带有值的值(来自数组)

                【讨论】:

                  【解决方案20】:

                  对于一个对象:

                  <select ng-model="mySelect" ng-options="key as value for (key, value) in object"></select>
                  

                  【讨论】:

                    【解决方案21】:

                    对于开发人员来说,使用 ng-options 总是很痛苦。例如:在选择标签中获取一个空/空白的选定值。尤其是在 ng-options 中处理 JSON 对象时,变得更加繁琐。在这里我做了一些练习。

                    目标:通过 ng-option 迭代 JSON 对象数组并设置选定的第一个元素。

                    数据:

                    someNames = [{"id":"1", "someName":"xyz"}, {"id":"2", "someName":"abc"}]
                    

                    在选择标签中,我必须显示 xyz 和 abc,其中 xyz 必须毫不费力地选择。

                    HTML:

                    <pre class="default prettyprint prettyprinted" style=""><code>
                        &lt;select class="form-control" name="test" style="width:160px"    ng-options="name.someName for name in someNames" ng-model="testModel.test" ng-selected = "testModel.test = testModel.test || someNames[0]"&gt;
                    &lt;/select&gt;
                    </code></pre>
                    

                    通过上面的代码示例,您可能会摆脱这种夸张。

                    另一个reference

                    【讨论】:

                      【解决方案22】:

                      教程ANGULAR.JS: NG-SELECT AND NG-OPTIONS帮我解决了问题:

                      <select id="countryId"
                        class="form-control"
                        data-ng-model="entity.countryId"
                        ng-options="value.dataValue as value.dataText group by value.group for value in countries"></select>
                      

                      【讨论】:

                        【解决方案23】:
                        <select ng-model="output">
                           <option ng-repeat="(key,val) in dictionary" value="{{key}}">{{val}}</option>
                        </select>
                        

                        【讨论】:

                        【解决方案24】:

                        运行代码 sn-p 并查看变化。这里是快速理解的注意事项

                        1. 示例 1(对象选择):- ng-option="os.name for os in osList track by os.id"。这里track by os.id 很重要,应该在那里,os.id as 不应该os.name 之前。

                          • ng-model="my_os" 应设置为键为 id 的对象,例如 my_os={id: 2}
                        2. 示例 2(值选择):- ng-option="os.id as os.name for os in osList"。这里track by os.id不应该在那里,os.id as应该os.name之前出现。

                          • ng-model="my_os" 应设置为类似my_os= 2 的值

                        剩下的代码sn-p会解释。

                        angular.module('app', []).controller('ctrl', function($scope, $timeout){
                          
                          //************ EXAMPLE 1 *******************
                          $scope.osList =[
                            { id: 1, name :'iOS'},
                            { id: 2, name :'Android'},
                            { id: 3, name :'Windows'}
                          ]
                          $scope.my_os = {id: 2};
                          
                          
                          //************ EXAMPLE 2 *******************
                          $timeout(function(){
                            $scope.siteList = [
                                  { id: 1, name: 'Google'},
                                  { id: 2, name: 'Yahoo'},
                                  { id: 3, name: 'Bing'}
                                ];
                           }, 1000);
                            
                            $scope.my_site = 2;
                          
                            $timeout(function(){
                              $scope.my_site = 3;
                            }, 2000);
                        })
                        fieldset{
                          margin-bottom: 40px;
                          }
                        strong{
                          color:red;
                          }
                        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.10/angular.min.js"></script>
                        
                        <div ng-app="app" ng-controller="ctrl">
                        
                          <!--//************ EXAMPLE 1 *******************-->
                          <fieldset>
                            <legend>Example 1 (Set selection as <strong>object</strong>)</legend>
                            
                            <select ng-model="my_os" ng-options="os.name for os in osList track by os.id">
                                <option value="">--Select--</option>
                              </select>
                            {{my_os}}
                            
                          </fieldset>
                          
                          
                          <!--//************ EXAMPLE 2 *******************-->
                          <fieldset>
                            <legend>Example 2 (Set selection as <strong>value</strong>. Simulate ajax)</legend>
                              <select ng-model="my_site" ng-options="site.id as site.name for site in siteList">
                                <option value="">--Select--</option>
                              </select>
                              {{my_site}}
                          </fieldset>
                          
                        </div>

                        【讨论】:

                          【解决方案25】:

                          正如许多人之前所说,如果我有这样的数据:

                          countries : [
                                        {
                                           "key": 1,
                                           "name": "UAE"
                                       },
                                        {
                                            "key": 2,
                                            "name": "India"
                                        },
                                        {
                                            "key": 3,
                                            "name": "OMAN"
                                        }
                                   ]
                          

                          我会这样使用它:

                          <select
                              ng-model="selectedCountry"
                              ng-options="obj.name for obj  in countries">
                          </select>
                          

                          在您的控制器中,您需要设置一个初始值以摆脱第一个空项目:

                           $scope.selectedCountry = $scope.countries[0];
                          
                           // You need to watch changes to get selected value
                           $scope.$watchCollection(function() {
                             return $scope.selectedCountry
                           }, function(newVal, oldVal) {
                               if (newVal === oldVal) {
                                 console.log("nothing has changed " + $scope.selectedCountry)
                               } 
                               else {
                                 console.log('new value ' + $scope.selectedCountry)
                               }
                           }, true)
                          

                          【讨论】:

                            【解决方案26】:

                            这是我在旧版应用程序中解决此问题的方法:

                            在 HTML 中:

                            ng-options="kitType.name for kitType in vm.kitTypes track by kitType.id" ng-model="vm.itemTypeId"
                            

                            在 JavaScript 中:

                            vm.kitTypes = [
                                {"id": "1", "name": "Virtual"},
                                {"id": "2", "name": "Physical"},
                                {"id": "3", "name": "Hybrid"}
                            ];
                            

                            ...

                            vm.itemTypeId = vm.kitTypes.filter(function(value, index, array){
                                return value.id === (vm.itemTypeId || 1);
                            })[0];
                            

                            我的 HTML 正确显示了选项值。

                            【讨论】:

                              【解决方案27】:

                              ngOptions 指令:

                              $scope.items = [{name: 'a', age: 20},{ name: 'b', age: 30},{ name: 'c', age: 40}];
                              
                              • Case-1) 数组中值的标签:

                                <div>
                                    <p>selected item is : {{selectedItem}}</p>
                                    <p> age of selected item is : {{selectedItem.age}} </p>
                                    <select ng-model="selectedItem" ng-options="item.name for item in items">
                                    </select>
                                </div>
                                

                              输出说明(假设选择了第一个项目):

                              selectedItem = {name: 'a', age: 20} // 【默认情况下,选中项等于值item]

                              selectedItem.age = 20

                              • 案例 2)选择作为数组中值的标签:

                                <div>
                                    <p>selected item is : {{selectedItem}}</p>
                                    <select ng-model="selectedItem" ng-options="item.age as item.name for item in items">
                                    </select>
                                </div>
                                

                              输出说明(假设选择了第一个项目): selectedItem = 20 // [选择部分是item.age]

                              【讨论】:

                                猜你喜欢
                                相关资源
                                最近更新 更多
                                热门标签