关于javascript:如何在AngularJS的ng-options中设置value属性?

How do I set the value property in AngularJS' ng-options?

这就是困扰很多人(包括我)的事情。

在AngularJS中使用ng-options指令来填充中,我们通常需要区分代码中的实际值和元素模型中的内容。请参见obj.value as obj.text和obj.text之间的差异

  • 它确实用obj.value填充了选项的属性。就像你的例子一样。
  • 你想要什么样的价值观?
  • 很奇怪,但我在Chrome和FF中得到了第1个
  • 好的,我现在明白了。我本来希望看到select标记,其中的选项值来自obj.value(它们没有),但对我来说,足够让模型拥有所选对象了。非常感谢你的帮助。
  • 对不起,我的错,我在看绑定模型,它没有设置值。但如果你不需要在角度之外访问它,你就不需要它。
  • 我想这里有个小虫子。如果您在for值中输入任何其他数字,它将永远不会将这些值实际生成为HTML值。例如,如果您将"字符串中的任何内容"作为值写入,它仍然会为您的值生成递增的数字。
  • 这不是bug,这是一个特性。AngularJS在内部处理NgoOptions和NgModel,这样它允许您使用任何类型的对象作为选项中的值,而不仅仅是字符串。您不应该试图以另一种方式获得select的值,您只需要使用附加到select元素的ngmodel。
  • select需要一个ng-model属性,它才能做任何事情。这是我今天在角度上遇到的一个奇怪的问题,我打算作为一个bug报告;如果没有ng-model属性,select将不会显示ng-options的选项。
  • 好吧,没有ng-modelselectng-options是相当无用的。另外,由于没有ng-model,它会使选择哪个选项变得含糊不清。
  • 我不同意。在内部,select指令可以很容易地使用它自己的不可见模型来跟踪所选的选项。即使它没有在内部跟踪模型值,它也至少可以呈现选项,只需预先准备并选择空选项(如果将模型设置为不在选项集中的值,它现在的行为就是这样)。显示选项的唯一依赖性是选项本身——这里应用POLA原则。
  • 而且,它也不一定是无用的。我可以假设很多用例,比如select与一个定制指令一起使用,它取代了ngModel的需求。ngModel的透明要求是反直觉的。(在这一点上,至少有一个提供信息的例外是合理的。)
  • 我认为,开发一个仅与ngModel同步的select指令会更容易,也更容易考虑,任何其他违反dry的指令。为了创建一个代替ngModel的指令,我将创建一个与ngModel一起工作的指令。然而,我绝对同意无声的失败问题。
  • 奇怪的可怕语法。
  • 的datalist元素,以便datalist可以通过其值引用选项。谢谢你@bruno gomes
  • 这是唯一适合我的解决方案。谢谢。
  • 这应该是公认的答案
  • 对于选项框值与数组/对象匹配的ng选项,这是最合适的答案。如果有奖励交换系统的话,我会给你10000点积分来拯救每个人的一天。角度组中最奇怪的语法。
  • 谢谢您!这很长一段时间都让人沮丧!
  • 我希望房价永远不一样,因为这样就可以了。
  • 是的,是真的D:
  • 单击Select后是否可以对ng选项进行Ajax调用?
  • 我认为是这样。。。但是你会点击,呼叫请求…此时选择将不被填充,您应该再次单击选择…但会一次又一次地调用请求
  • 路过是关键!
  • 这应该是迄今为止最好的答案,并被选作答案,因为这是唯一适合我的解决方案。实际上,在AngularJS中,您不需要担心什么是值,即0,1,2(默认情况下是值),因为您可以获得整个对象作为值。请参阅此答案stackoverflow.com/questions/12139152/…
  • 这是对这个特定问题的一个更好的答案,但每个人都在继续投票复制/粘贴文档。
  • 很棒的总结,布鲁诺:)
  • @布鲁诺戈姆我需要帮助,请看一看这个问题
  • 这是唯一适合我的答案

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

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

    您可以这样做:

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

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


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

    杰森:

    1
    2
    3
    4
    5
    6
    7
    "heroes": [
      {"id":"iron","label":"Iron Man Rocks!
    <hr><P>似乎<wyn>ng-options</wyn>的使用很复杂(可能令人沮丧),但实际上我们有一个体系结构问题。</P><P>AngularJS是动态HTML+javascript应用程序的MVC框架。虽然它的(v)iew组件提供了HTML"
    模板化",但其主要目的是通过控制器将用户操作连接到模型中的更改。因此,在AngularJS中工作的适当抽象级别是,select元素将模型中的值设置为查询中的值。</P><ul><li>查询行如何呈现给用户是(v)视图的关注点,<wyn>ng-options</wyn>提供<wyn>for</wyn>关键字来指定选项元素的内容,即<wyn>p.text for p in resultOptions</wyn>。</li><li>所选行如何显示给服务器是(M)模型关注的问题。因此,<wyn>ng-options</wyn>提供<wyn>as</wyn>关键字来指定在<wyn>k as v for (k,v) in objects</wyn>中为模型提供的值。</li></ul><P>正确的解决方案这个问题本质上就是体系结构,它涉及到重构HTML,以便(M)模型在需要时(而不是用户提交表单)执行服务器通信。</P><P>如果对于手头的问题,MVC HTML页面不需要过于工程化:那么只使用AngularJS(v)IEW组件的HTML生成部分。在这种情况下,按照与生成诸如<wyn>&lt;ul /&gt;</wyn>下的<wyn>&lt;li /&gt;</wyn>等元素相同的模式,在选项元素上放置一个ng repeat:</P>[cc lang="javascript"]<select name="value">
        <option ng-repeat="
    value in Model.Values" value="{{value.value}}">
            {{value.text}}
        </option>
    </select>

    作为组合,可以始终将select元素的name属性移动到隐藏的输入元素:

    1
    2
    3
    <select ng-model="selectedValue" ng-options="value.text for value in Model.Values">
    </select>
    <input type="hidden" name="value" value="{{selectedValue}}" />


    您可以这样做:

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

    ——更新

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

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