318

我已经搜索了谷歌,但在这方面找不到任何东西。

我有这个代码。

<select ng-model="somethingHere" 
        ng-options="option.value as option.name for option in options"
></select>

有了这样的一些数据

options = [{
   name: 'Something Cool',
   value: 'something-cool-value'
}, {
   name: 'Something Else',
   value: 'something-else-value'
}];

输出是这样的。

<select ng-model="somethingHere"  
        ng-options="option.value as option.name for option in options" 
        class="ng-pristine ng-valid">

    <option value="?" selected="selected"></option>
    <option value="0">Something Cool</option>
    <option value="1">Something Else</option>
</select>

如何将数据中的第一个选项设置为默认值,这样您就会得到这样的结果。

<select ng-model="somethingHere" ....>
    <option value="0" selected="selected">Something Cool</option>
    <option value="1">Something Else</option>
</select>
4

23 回答 23

378

您可以像这样简单地使用ng-init

<select ng-init="somethingHere = options[0]" 
        ng-model="somethingHere" 
        ng-options="option.name for option in options">
</select>
于 2013-08-12T19:38:00.897 回答
239

如果你想确保你的$scope.somethingHere值在你的视图初始化时不会被覆盖,你需要somethingHere = somethingHere || options[0].value像这样在你的 ng-init 中合并()值:

<select ng-model="somethingHere" 
        ng-init="somethingHere = somethingHere || options[0].value"
        ng-options="option.value as option.name for option in options">
</select>
于 2013-08-12T20:04:25.540 回答
72

试试这个:

HTML

<select 
    ng-model="selectedOption" 
    ng-options="option.name for option in options">
</select>

Javascript

function Ctrl($scope) {
    $scope.options = [
        {
          name: 'Something Cool',
          value: 'something-cool-value'
        }, 
        {
          name: 'Something Else',
          value: 'something-else-value'
        }
    ];

    $scope.selectedOption = $scope.options[0];
}

Plunker在这里

如果您真的想设置将绑定到模型的值,则将ng-options属性更改为

ng-options="option.value as option.name for option in options"

和Javascript

...
$scope.selectedOption = $scope.options[0].value;

考虑到上述情况,这里的另一个 Plunker 。

于 2013-08-12T18:56:58.197 回答
42

Srivathsa Harish Venkataramana只有一个回答提到track by这确实是一个解决方案!

track by这是一个示例以及如何在select 中使用的 Plunker(下面的链接)ng-options

<select ng-model="selectedCity"
        ng-options="city as city.name for city in cities track by city.id">
  <option value="">-- Select City --</option>
</select>

如果selectedCity在角度范围上定义,并且它具有与列表中任何id一个相同的值的属性,它将在加载时自动选择。idcitycities

这是 Plunker: http ://plnkr.co/edit/1EVs7R20pCffewrG0EmI?p=preview

有关更多详细信息,请参阅源文档: https ://code.angularjs.org/1.3.15/docs/api/ng/directive/select

于 2015-04-10T15:05:40.843 回答
33

我认为,在包含 'track by' 之后,您可以在 ng-options 中使用它来获得您想要的内容,如下所示

 <select ng-model="somethingHere" ng-options="option.name for option in options track by option.value" ></select>

这种做法更好,因为当您想用对象列表替换字符串列表时,您只需将其更改为

 <select ng-model="somethingHere" ng-options="object.name for option in options track by object.id" ></select>

其中 somethingHere 是一个具有属性 name 和 id 的对象,当然。请注意,'as' 不是以这种方式表达 ng-options 的,因为它只会设置值,当你使用 track by 时你将无法更改它

于 2014-03-31T16:24:52.877 回答
23

接受的答案使用ng-init,但文件说尽可能避免使用 ng-init 。

ngInit 唯一合适的用途是为 ngRepeat 的特殊属性设置别名,如下面的演示所示。除了这种情况,您应该使用控制器而不是 ngInit 来初始化作用域上的值。

您也可以使用ng-repeat 代替ng-options您的选项。使用ng-repeat,您可以使用ng-selected特殊ng-repeat属性。即 $index, $odd, $even 使这项工作无需任何编码。

$first是 ng-repeat 的特殊属性之一。

  <select ng-model="foo">
    <option ng-selected="$first" ng-repeat="(id,value) in myOptions" value="{{id}}">
      {{value}}
    </option>
  </select>

---------------------- 编辑 ----------------
虽然这可行,但我更喜欢@mik-t's当您知道要选择什么值时回答https://stackoverflow.com/a/29564802/454252,它使用track-byng-options不使用ng-initor ng-repeat

仅当您必须选择第一项而不知道要选择什么值时,才应使用此答案。例如,我将其用于自动完成,这需要始终选择第一个项目。

于 2015-04-09T20:26:13.447 回答
16

我对此的解决方案是使用 html 对我的默认选项进行硬编码。像这样:

在 HAML 中:

%select{'ng-model' => 'province', 'ng-options' => "province as province for province in summary.provinces", 'chosen' => "chosen-select", 'data-placeholder' => "BC & ON"}
  %option{:value => "", :selected => "selected"}
    BC &amp; ON

在 HTML 中:

<select ng-model="province" ng-options="province as province for province in summary.provinces" chosen="chosen-select" data-placeholder="BC & ON">
  <option value="" selected="selected">BC &amp; ON</option>
</select>

我希望我的默认选项从我的 api 返回所有值,这就是为什么我有一个空白值。也请原谅我的haml。我知道这不是对 OP 问题的直接答案,但人们在 Google 上找到了这个。希望这对其他人有帮助。

于 2013-12-10T18:21:35.367 回答
15

使用下面的代码从您的模型中填充选定的选项。

<select id="roomForListing" ng-model="selectedRoom.roomName" >

<option ng-repeat="room in roomList" title="{{room.roomName}}" ng-selected="{{room.roomName == selectedRoom.roomName}}" value="{{room.roomName}}">{{room.roomName}}</option>

</select>
于 2015-06-11T13:35:49.630 回答
10

根据您有多少选项,您可以将您的值放在一个数组中并像这样自动填充您的选项

<select ng-model="somethingHere.values" ng-options="values for values in [5,4,3,2,1]">
   <option value="">Pick a Number</option>
</select>
于 2014-10-15T21:54:21.597 回答
10

就我而言,我只需要插入一个初始值来告诉用户选择一个选项,所以,我喜欢下面的代码:

<select ...
    <option value="" ng-selected="selected">Select one option</option>
</select>

当我尝试使用值为 != 的空字符串(null)的选项时,该选项被 angular 替换,但是,当放置这样的选项(具有 null 值)时,选择会出现此选项。

对不起,我的英语不好,我希望我能在这方面有所帮助。

于 2016-02-04T17:22:47.063 回答
9

使用selectwithngOptions并设置默认值:

有关更多使用示例,请参阅ngOptions文档。ngOptions

angular.module('defaultValueSelect', [])
 .controller('ExampleController', ['$scope', function($scope) {
   $scope.data = {
    availableOptions: [
      {id: '1', name: 'Option A'},
      {id: '2', name: 'Option B'},
      {id: '3', name: 'Option C'}
    ],
    selectedOption: {id: '2', name: 'Option B'} //This sets the default value of the select in the ui
    };
}]);
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0-rc.0/angular.min.js"></script>
<body ng-app="defaultValueSelect">
  <div ng-controller="ExampleController">
  <form name="myForm">
    <label for="mySelect">Make a choice:</label>
    <select name="mySelect" id="mySelect"
      ng-options="option.name for option in data.availableOptions track by option.id"
      ng-model="data.selectedOption"></select>
  </form>
  <hr>
  <tt>option = {{data.selectedOption}}</tt><br/>
</div>

plnkr.co

关于带有角度数据绑定的HTMLSELECT元素的官方文档。

通过解析/格式化绑定select到非字符串值:ngModel

(function(angular) {
  'use strict';
angular.module('nonStringSelect', [])
  .run(function($rootScope) {
    $rootScope.model = { id: 2 };
  })
  .directive('convertToNumber', function() {
    return {
      require: 'ngModel',
      link: function(scope, element, attrs, ngModel) {
        ngModel.$parsers.push(function(val) {
          return parseInt(val, 10);
        });
        ngModel.$formatters.push(function(val) {
          return '' + val;
        });
      }
    };
  });
})(window.angular);
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0-rc.1/angular.min.js"></script>
<body ng-app="nonStringSelect">
  <select ng-model="model.id" convert-to-number>
  <option value="1">One</option>
  <option value="2">Two</option>
  <option value="3">Three</option>
</select>
{{ model }}
</body>

plnkr.co

其他示例:

angular.module('defaultValueSelect', [])
 .controller('ExampleController', ['$scope', function($scope) {
   $scope.availableOptions = [
     { name: 'Apple', value: 'apple' }, 
     { name: 'Banana', value: 'banana' }, 
     { name: 'Kiwi', value: 'kiwi' }
   ];
   $scope.data = {selectedOption : $scope.availableOptions[1].value};
}]);
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.5.0-rc.0/angular.min.js"></script>
<body ng-app="defaultValueSelect">
  <div ng-controller="ExampleController">
  <form name="myForm">
    <select ng-model="data.selectedOption" required ng-options="option.value as option.name for option in availableOptions"></select>
  </form>  
  </div>
</body>

jsfiddle

于 2016-01-19T19:44:37.430 回答
5

这对我有用。

<select ng-model="somethingHere" ng-init="somethingHere='Cool'">
    <option value="Cool">Something Cool</option>
    <option value="Else">Something Else</option>
</select>
于 2016-10-14T05:18:19.413 回答
3

在我的情况下,因为默认值因表单中的情况而异。我在选择标签中添加了一个自定义属性。

 <select setSeletected="{{data.value}}">
      <option value="value1"> value1....
      <option value="value2"> value2....
       ......

在指令中,我创建了一个检查值的脚本,当角度填充它时,将具有该值的选项设置为选中。

 .directive('setSelected', function(){
    restrict: 'A',
    link: (scope, element, attrs){
     function setSel=(){
     //test if the value is defined if not try again if so run the command
       if (typeof attrs.setSelected=='undefined'){             
         window.setTimeout( function(){setSel()},300) 
       }else{
         element.find('[value="'+attrs.setSelected+'"]').prop('selected',true);          
       }
     }
    }

  setSel()

})

刚刚从 coffescript 即时翻译了这个,如果不是洞的话,至少它的要点是正确的。

这不是最简单的方法,但在价值变化时完成

于 2015-03-24T14:01:37.080 回答
3

回应Ben Lesh 的回答,应该有这行

ng-init="somethingHere = somethingHere || options[0]" 

代替

ng-init="somethingHere = somethingHere || options[0].value" 

那是,

<select ng-model="somethingHere"
        ng-init="somethingHere = somethingHere || options[0]"
        ng-options="option.name for option in options track by option.value">
</select>

于 2016-04-22T01:11:26.360 回答
3

简单使用ng-selected="true"如下:

<select ng-model="myModel">
        <option value="a" ng-selected="true">A</option>
        <option value="b">B</option>
</select>
于 2016-09-20T16:14:11.440 回答
2

我会在控制器中设置模型。然后选择将默认为该值。例如:html:

<select ng-options="..." ng-model="selectedItem">

角度控制器(使用资源):

myResource.items(function(items){
  $scope.items=items;
  if(items.length>0){
     $scope.selectedItem= items[0];
//if you want the first. Could be from config whatever
  }
});
于 2015-11-11T12:29:20.330 回答
2

这对我有用

ng-selected="true" 
于 2016-10-21T07:36:52.873 回答
1

如果您ng-options用于渲染下拉,option则默认选择与 ng-modal 相同的值。考虑这个例子:

<select ng-options="list.key as list.name for list in lists track by list.id" ng-model="selectedItem">

list.key因此,与,具有相同值的选项 selectedItem是默认选择的。

于 2015-06-26T08:59:06.810 回答
1

我需要默认的“请选择”不可选择。我还需要能够有条件地设置默认选择的选项。

我通过以下简单的方式实现了这一点: JS 代码:// 翻转这 2 个以使用默认的“请选择”文本测试选定的默认值或无默认值 //$scope.defaultOption = 0; $scope.defaultOption = { 键:'3',值:'选项 3' };

$scope.options = [
   { key: '1', value: 'Option 1' },
   { key: '2', value: 'Option 2' },
   { key: '3', value: 'Option 3' },
   { key: '4', value: 'Option 4' }
];

getOptions();

function getOptions(){
    if ($scope.defaultOption != 0)
    { $scope.options.selectedOption = $scope.defaultOption; }
}

HTML:

<select name="OptionSelect" id="OptionSelect" ng-model="options.selectedOption" ng-options="item.value for item in options track by item.key">
<option value="" disabled selected style="display: none;"> -- Please Select -- </option>
</select>
<h1>You selected: {{options.selectedOption.key}}</h1>         

我希望这可以帮助其他有类似要求的人。

“请选择”是通过 Joffrey Outtier 的回答完成

于 2016-11-08T15:55:26.560 回答
0

如果你有一些东西而不是仅仅初始化日期部分,你可以ng-init()通过在你的控制器中声明它来使用它,并在你的 HTML 的顶部使用它。这个函数就像你的控制器的构造函数一样工作,你可以在那里启动你的变量。

angular.module('myApp', [])
 .controller('myController', ['$scope', ($scope) => {
   $scope.allOptions = [
     { name: 'Apple', value: 'apple' }, 
     { name: 'Banana', value: 'banana' }
   ];
   $scope.myInit = () => {
      $scope.userSelected = 'apple'
      // Other initiations can goes here..
   }
}]);


<body ng-app="myApp">
  <div ng-controller="myController" ng-init="init()">
    <select ng-model="userSelected" ng-options="option.value as option.name for option in allOptions"></select>
   </div>
</body>
于 2017-01-24T08:11:44.517 回答
0
    <!--
    Using following solution you can set initial 
default value at controller as well as after change option selected value shown as default.
    -->
    <script type="text/javascript">
      function myCtrl($scope)
        {
          //...
            $scope.myModel=Initial Default Value; //set default value as required
          //..
        }
    </script>
    <select ng-model="myModel" 
                ng-init="myModel= myModel"
                ng-options="option.value as option.name for option in options">
        </select>
于 2017-06-16T14:44:29.070 回答
0

在你的角度控制器中试试这个......

$somethingHere = {name: 'Something Cool'};

您可以设置一个值,但您使用的是复杂类型,并且角度将搜索键/值以在您的视图中设置。

而且,如果不起作用,请尝试以下操作:ng-options="option.value as option.name for option in options track by option.name"

于 2017-07-19T16:19:41.560 回答
-2

我认为最简单的方法是

 ng-selected="$first"
于 2015-02-10T21:25:45.727 回答