如何使用ng-option设置选择元素的默认值


148

我在这里看到了Angular select指令的文档:http : //docs.angularjs.org/api/ng.directive :select 。我不知道如何设置默认值。这令人困惑:

选择作为数组中值的标签

这是对象:

{
    "type": "select", 
    "name": "Service",
    "value": "Service 3", 
    "values": [ "Service 1", "Service 2", "Service 3", "Service 4"] 
}

HTML(工作):

<select><option ng-repeat="value in prop.values">{{value}}</option></select>

然后我试图在select元素内添加ng-option属性以设置prop.value为默认选项(不起作用)。

ng-options="(prop.value) for v in prop.values"

我究竟做错了什么?

Answers:


131

因此,假设该对象在您的范围内:

<div ng-controller="MyCtrl">
  <select ng-model="prop.value" ng-options="v for v in prop.values">
  </select>
</div>

 

function MyCtrl($scope) {
  $scope.prop = {
    "type": "select", 
    "name": "Service",
    "value": "Service 3", 
    "values": [ "Service 1", "Service 2", "Service 3", "Service 4"] 
  };
}

工作的Plunkr:http://plnkr.co/edit/wTRXZYEPrZJRizEltQ2g


2
好,我知道了!在ng-option被替换<option ng-repeat="value in prop.values">{{value}}</option>再次感谢
弗朗索瓦·罗曼

2
必须有一种更简单的方法来执行此操作,对于角度js中的简单选择默认值,我发现这非常复杂
Edmund Rojas 2015年

1
ng-option指令的语法有些复杂且令人困惑。我认为绑定对象的灵活性使其变得有些复杂。我试图记住的方式是,每当我使用一个对象时,我都会明确指出要用于select控件的value / text属性的属性。有关更多信息,请参阅: ozkary.com/2015/08/angularjs-ngoption-directive-simplified.html
ozkary 2015年

2
如果您想在视图中构建一个选择而无需写出选项并选择一个,则选择<select ng-model="limit" value="10" ng-options="v for v in [5,10,15,20,30,50]"></select>
阿瑟拉德

1
@james Kleeh ..这里您对第一个选项进行硬编码,因为您知道它们。但是,如果我们不知道这些选项,默认情况下如何显示第一个选项?
H Varma

69

select * 的角度文档没有明确回答此问题,但确实存在。如果您查看script.js,则会看到以下内容:

function MyCntrl($scope) {
  $scope.colors = [
    {name:'black', shade:'dark'},
    {name:'white', shade:'light'},
    {name:'red', shade:'dark'},
    {name:'blue', shade:'dark'},
    {name:'yellow', shade:'light'}
  ];
  $scope.color = $scope.colors[2]; // Default the color to red
}

这是html:

<select ng-model="color" ng-options="c.name for c in colors"></select>

这似乎是将<select>with中的选定值默认为默认值的更明显的方法ng-options。如果您使用不同的标签/值,它也将起作用。

* 这是从Angular 1.2.7开始的


这对我有用,我怀疑是否还会再次出现,但是我目前正在使用AngularJS v1.2.27,以防万一有人发现此问题并想知道兼容性。
罗伯特·卡德米尔

41

当您从数据库中获取数据,进行修改然后保留更改时,此答案更有用。

 <select  ng-options="opt.id as opt.name for opt in users" ng-model="selectedUser"></select>

在此处查看示例:

http://plnkr.co/edit/HrT5vUMJOtP9esGngbIV


终于在这里找到了可行的答案!同样,使用此解决方案,您可以正确地使用未定义的选项。<option value =“”>请选择</ option>
DDD

很高兴这篇文章存在,我一直在寻找解决方案,而这篇文章已经解决了我的问题。
slee423

22
<select name='partyid' id="partyid" class='span3'>
<option value=''>Select Party</option>
<option ng-repeat="item in partyName" value="{{item._id}}" ng-selected="obj.partyname == item.partyname">{{item.partyname}}
</option>
</select>

5
此处的错误做法...请看第二个黄色注释:docs.angularjs.org/api/ng/directive/select
M'sieur Toph'14-10-16

这是行不通的,例如。当您尝试编辑记录时,记录将如何与字段绑定?
windmaomao 2015年

21

如果您的对象数组很复杂,例如:

$scope.friends = [{ name: John , uuid: 1234}, {name: Joe, uuid, 5678}];

并且您当前的模型设置为:

$scope.user.friend = {name:John, uuid: 1234};

track by只要ng-model =“ user.friend”也有一个uuid,它有助于在uuid(或任何唯一字段)上使用该函数:

<select ng-model="user.friend" 
ng-options="friend as friend.name for friend in friends track by friend.uuid"> 
</select>

这个答案使我高兴!还可以查看此文档中的跟踪方式:docs.angularjs.org/api/ng/directive/ngOptions
Arashsoft

这是最好的答案!
Gerfried

10

我花了几个小时苦苦挣扎,所以我想对此做些澄清,这里提到的所有示例都是指从脚本本身而不是从服务或数据库中加载数据的情况,因此,我想为遇到同样问题的任何人提供经验。

通常,您只在数据库中保存所需选项的ID,所以...让我们展示一下

service.js

myApp.factory('Models', function($http) {
var models = {};
models.allModels = function(options) {
    return $http.post(url_service, {options: options});
};

return models;
});

controller.js

myApp.controller('exampleController', function($scope, Models) {
$scope.mainObj={id_main: 1, id_model: 101};
$scope.selected_model = $scope.mainObj.id_model;
Models.allModels({}).success(function(data) {
    $scope.models = data; 
});
});

最后是部分html model.html

Model: <select ng-model="selected_model" 
ng-options="model.id_model as model.name for model in models" ></select>

基本上,我想指出那段“ model.id_model作为模型中模型model.name ”,“ model.id_model ”使用模型的ID作为值,以便您可以与“ mainObj.id_model ” 匹配“ selected_model ”,这只是一个简单的值,“ as model.name ”也是转发器的标签,最后“ models in models ”只是我们都知道的常规循环。

希望这对某人有帮助,如果有帮助,请投票:D


1
您可以将选择mainObj.id_model直接绑定到(ng-model="mainObj.id_model"),而不是使用“占位符/纯值”变量selected_model
drzaus 2014年

是的,确实,我只是想表明可以直接在$ scope中使用一个值来完成此操作,但是感谢您指出这一点。
Wiston Coronell 2014年

是否可以绑定到一个对象而不仅仅是一个int?我无法让我的nGoptions设置其选中的项目,因为它不知道如何将我的{id:24}绑定到我的[{id:23},{id:24},{id:25}]。
Victorio Berra 2015年

您可以始终使用$ index来获取位置,但是,是的,可以绑定到对象
Wiston Coronell 2015年

10
<select id="itemDescFormId" name="itemDescFormId" size="1" ng-model="prop" ng-change="update()">
    <option value="">English(EN)</option>
    <option value="23">Corsican(CO)</option>
    <option value="43">French(FR)</option>
    <option value="16">German(GR)</option>

只需添加具有空值的选项。会的。

演示版


如果您添加类似内容,则确实有效<option value="" disabled>Please Select</option>
fWd82 '17

9

一个更简单的方法是像这样使用data-ng-init

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

这里的主要区别是您需要包括 data-ng-model


3
如文档中所指定:ngInit的唯一适当用法是为ngRepeat的特殊属性添加别名,如下面的演示所示。除了这种情况,您应该使用控制器而不是ngInit来初始化作用域上的值。
user12121234

1
我用ng-options发布的方式更加简单和具体。两种方式都可以。
Wyetro

3

NG-模型属性设置所选择的选项,也可以让你管就像一个过滤器排序依据:orderModel.value

index.html

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

controllers.js

$scope.orderOptions = [
    {"name":"Newest","value":"age"},
    {"name":"Alphabetical","value":"name"}
];

$scope.orderModel = $scope.orderOptions[0];

1
尝试这个,我明白了angular.js:117 TypeError: a.forEach is not a function。有什么想法吗?
卡门主义

1

如果有人偶尔遇到默认值,而有时却没有在Chrome,IE 10/11,Firefox中填充该默认值,请尝试将此属性添加到输入/选择字段中,以检查HTML中的填充变量,如下所示:

<input data-ng-model="vm.x" data-ng-if="vm.x !== '' && vm.x !== undefined && vm.x !== null" />

0

如果您不关心使用一些数字ID为选项编制索引,这真的很简单。

  1. 声明$ scope var-人数组

    $scope.people= ["", "YOU", "ME"];
  2. 在上述范围的DOM中,创建对象

    <select ng-model="hired" ng-options = "who for who in people"></select>
  3. 在您的控制器中,将ng-model设置为“ hired”。

    $scope.hired = "ME";

祝好运!!!真的很简单!


0

只是加起来,我做了这样的事情。

 <select class="form-control" data-ng-model="itemSelect" ng-change="selectedTemplate(itemSelect)" autofocus>
        <option value="undefined" [selected]="itemSelect.Name == undefined" disabled="disabled">Select template...</option>
        <option ng-repeat="itemSelect in templateLists" value="{{itemSelect.ID}}">{{itemSelect.Name}}</option></select>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.