【问题标题】:ng-options with simple array init带有简单数组初始化的 ng-options
【发布时间】:2014-09-11 14:18:24
【问题描述】:

我对 Angular 和 ng-options 有点困惑。

我有一个简单的数组,我想用它初始化一个选择。但是,我想要那个选项值 = 标签。

script.js

$scope.options = ['var1', 'var2', 'var3'];

html

<select ng-model="myselect" ng-options="o for o in options"></select>

我得到了什么:

<option value="0">var1</option>
<option value="1">var2</option>
<option value="2">var3</option>

我想要什么:

<option value="var1">var1</option>
<option value="var2">var2</option>
<option value="var3">var3</option>

所以我尝试了:

<select ng-model="myselect2" ng-init=0 ng-options="options[k] as v for (k,v) in options"></select>

<select ng-model="myselect3" ng-init=0 ng-options="b as b for b in options"></select>

(但它不起作用。)

编辑:

我的表单是在外部提交的,这就是为什么我需要 'var1' 作为值而不是 0。

【问题讨论】:

    标签: angularjs ng-grid ng-options


    【解决方案1】:

    您可以像这样使用ng-repeatoption

    <form>
        <select ng-model="yourSelect" 
            ng-options="option as option for option in ['var1', 'var2', 'var3']"
            ng-init="yourSelect='var1'"></select>
        <input type="hidden" name="yourSelect" value="{{yourSelect}}" />
    </form>
    

    当您提交 form 时,您可以获得隐藏的输入值。


    DEMO

    ng-selected ng-repeat

    【讨论】:

    • 如果您对我的回答有所异议,请查看我的新解决方案。
    【解决方案2】:

    你在第三次尝试时实际上是正确的。

     <select ng-model="myselect" ng-options="o as o for o in options"></select>
    

    在此处查看一个工作示例: http://plnkr.co/edit/xEERH2zDQ5mPXt9qCl6k?p=preview

    诀窍在于 AngularJS 将键写为从 0 到 n 的数字,并在更新模型时转换回来。

    因此,HTML 看起来不正确,但在选择值时模型仍将正确设置。 (即 AngularJS 会将 '0' 翻译回 'var1')

    Epokk 的解决方案也有效,但是如果您异步加载数据,您可能会发现它并不总是正确更新。使用 ngOptions 将在范围更改时正确刷新。

    【讨论】:

    • 你跑题了。你没看懂说明。他想要value 在他的select 中。
    • 我理解了说明,但是他的意图很可能是将“值”绑定到模型,并且由于 AngularJs 呈现标签的方式而误解了正在发生的事情。
    • 如果您使用 angular 获取 select 的值,它可以工作,但在我的情况下(即经典提交表单),值将是 0,1,2,3,而不是 var1,var2,var3
    • 我假设您正在绑定到模型,但如果您只是使用 AngularJS 来呈现从外部提交到 Angular 的表单,那么请使用 EpokK 的解决方案。
    • 只有我一个人,还是这是有史以来最夸张和不清楚的语法?
    【解决方案3】:

    你可以使用类似的东西

    <select ng-model="myselect">
        <option ng-repeat="o in options" ng-selected="{{o==myselect}}" value="{{o}}">
            {{o}}
        </option>
    </select>
    

    使用 ng-selected 预选选项,以防 myselect 被预填充。

    无论如何,我更喜欢这种方法而不是 ng-options,因为 ng-options 仅适用于数组。 ng-repeat 也适用于类似 json 的对象。

    【讨论】:

    • ng-options 也适用于对象数据源。见docs.angularjs.org/api/ng/directive/select
    • 虽然其他人给出了解决方法,但这个解决方案是迄今为止最优雅和最接近旧 html 样式的,适用于角度模型绑定和表单提交。谢谢!
    • ng-selected 不需要把手,因为它是一个角度指令。很好的解决方案。
    【解决方案4】:
    <select ng-model="option" ng-options="o for o in options">
    

    $scope.option 更改后将等于 'var1',即使您在生成的 html 中看到 value="0"

    plunker

    【讨论】:

      【解决方案5】:

      如果您将选择设置如下:

      <select ng-model="myselect" ng-options="b for b in options track by b"></select>
      

      你会得到:

      <option value="var1">var1</option>
      <option value="var2">var2</option>
      <option value="var3">var3</option>
      

      工作小提琴:http://jsfiddle.net/x8kCZ/15/

      【讨论】:

      • 这个解决方案是唯一一个对我有用的选择字符串数组中的初始值的解决方案。
      • 是的,这应该是答案,track by 为我带来了魔力。
      • 在遵循上述解决方案后我最不期待,但这是最简单的方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多