如何使用Angular JS设置下拉列表控件的选定选项

145
我正在使用Angular JS,并且我需要使用Angular JS设置下拉列表控件的选中选项。如果这听起来荒谬,请原谅我,因为我对Angular JS还很陌生。
这是我HTML中的下拉列表控件:
 <select ng-required="item.id==8 && item.quantity > 0" name="posterVariants"
   ng-show="item.id==8" ng-model="item.selectedVariant" 
   ng-change="calculateServicesSubTotal(item)"
   ng-options="v.name for v in variants | filter:{type:2}">
  </select>

在它被填充之后,我得到的是
 <select ng-options="v.name for v in variants | filter:{type:2}" ng-change="calculateServicesSubTotal(item)"
ng-model="item.selectedVariant" ng-show="item.id==8" name="posterVariants"
ng-required="item.id==8 &amp;&amp; item.quantity &gt; 0" class="ng-pristine ng-valid ng-valid-required">
    <option value="?" selected="selected"></option>
    <option value="0">set of 6 traits</option>
    <option value="1">5 complete sets</option>
</select>

如何将控件设置为选中状态value="0"

6
<option value="0" ng-selected="true">set of 6 traits</option> - Muhammad Shahzad
9个回答

198

我希望我能理解你的问题,但是 ng-model 指令会在控制器中所选的项目和item.selectedVariant的值之间创建双向绑定。这意味着在JavaScript中更改item.selectedVariant的值或更改控件中的值都会更新其他内容。如果item.selectedVariant的值为0,则应选择该项。

如果variants是一个对象数组,则必须将item.selectedVariant设置为其中一个对象。我不知道您的作用域中有哪些信息,但以下是一个示例:

JS:

$scope.options = [{ name: "a", id: 1 }, { name: "b", id: 2 }];
$scope.selectedOption = $scope.options[1];

HTML:

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

这将使“b”项保留被选中。


我有一个名为order.js的控制器文件,因此html文件名也是order.html,其中包含控制器。我应该在那里设置selectedVariant还是直接在控制器上设置? - themhz
通常情况下,您会在控制器中设置这些内容,在$scope变量上。因此,假设您在单个作用域中,在控制器中,您可以说$scope.item.selectedVariant = 0,以设置默认选定值。您还可以直接在HTML中的控件上使用ng-init指令设置变量,但我认为那样会变得非常混乱! - Steve Klösters
你能详细说明一下你的作用域中 variants 是什么吗?你需要将 item.selectedVariant 正好设置为 variants 中的一个项目。 - Steve Klösters
$scope.item.selectedVariant = 0; 如果我将它放在控制器文件中,页面会崩溃。 - themhz
请查看此plnkr以获取一个可工作的示例,并尝试重现这些步骤! - Steve Klösters
显示剩余8条评论

36

我不知道这是否会对任何人有所帮助,但是因为我也遇到了同样的问题,所以我想分享一下我如何解决的。

你可以在你的ng-options中使用track by属性。

假设你有:

variants:[{'id':0, name:'set of 6 traits'}, {'id':1, name:'5 complete sets'}]

您可以将 ng-options 写成:

ng-options="v.name for v in variants track by v.id"

希望这能对未来的某个人有所帮助。


是的!终于了!谢谢。 - davaus
太好了。我错过了轨迹,以便动态地执行此操作。 - John
终于解决了!通过添加跟踪,我的问题得到了解决。谢谢。 - Kishan
这就是我缺少的!我正确地设置了绑定到ngModel的作用域字段,但直到我添加了track by才起作用!谢谢! - Cindy K.

7
我看到这里已经有了很好的答案,但有时候用其他形式来表述可能会更有帮助。
<div ng-app ng-controller="MyCtrl">
  <select ng-model="referral.organization" ng-options="c for c in organizations"></select>
</div>

<script type='text/javascript'>
  function MyCtrl($scope) {
    $scope.organizations = ['a', 'b', 'c', 'd', 'e'];
    $scope.referral = {
      organization: $scope.organizations[2]
    };
  }
</script>

如果我有一个多选的下拉菜单,那该怎么办?仅仅在模型中设置ID是不起作用的。 - Nikhil Sahu

7

我应该在哪里设置item.selectedVariant?如果我在文件的控制器中定义$scope.item.selectedVariant = 0;,Angular会崩溃。 - themhz
3
你能否附上相应的HTML代码? - T W
我认为orderGrid中的每个项目都需要将selectedVariant设置为0。 - T W
你能提供一个示例代码吗?很抱歉我不熟悉Angular。 - themhz

2

简单的方法

如果您得到的响应是一个用户或您定义的数组/JSON,首先您需要在控制器中设置所选值,然后将相同的模型名称放入HTML中。这个例子我写得尽可能简单易懂。
简单示例
在控制器内:

$scope.Users = ["Suresh","Mahesh","Ramesh"]; 
$scope.selectedUser = $scope.Users[0];

Your HTML

<select data-ng-options="usr for usr in Users" data-ng-model="selectedUser">
</select>

复杂例子
在控制器内:

$scope.JSON = {
       "ResponseObject":
           [{
               "Name": "Suresh",
               "userID": 1
           },
           {
               "Name": "Mahesh",
               "userID": 2
           }]
   };
   $scope.selectedUser = $scope.JSON.ResponseObject[0];

您的 HTML

<select data-ng-options="usr.Name for usr in JSON.ResponseObject" data-ng-model="selectedUser"></select>
<h3>You selected: {{selectedUser.Name}}</h3>    

1

它可能很有用。绑定并不总是起作用。

<select id="product" class="form-control" name="product" required
        ng-model="issue.productId"
        ng-change="getProductVersions()"
        ng-options="p.id as p.shortName for p in products">
</select>

例如,您可以从rest-service中填充选项列表源模型。在填充列表之前,已知选择的值并已设置。执行$http rest请求后,列表选项将完成。但是,由于未知原因,AngularJS在影子$digest执行时未将所选内容绑定为应该绑定的内容。我必须使用JQuery来设置所选内容。这很重要!Angular在影子中向由ng-repeat生成的optinos的attr“value”的值添加前缀。对于int,它是“number:”。
$scope.issue.productId = productId;
function activate() {
   $http.get('/product/list')
     .then(function (response) {
       $scope.products = response.data;

       if (productId) {
           console.log("" + $("#product option").length);//for clarity                       
           $timeout(function () {
               console.log("" + $("#product option").length);//for clarity
               $('#product').val('number:'+productId);
               //$scope.issue.productId = productId;//not work at all
           }, 200);
       }
   });
}

0
尝试以下操作:
JS文件
this.options = { 
        languages: [{language: 'English', lg:'en'}, {language:'German', lg:'de'}]
};
console.log(signinDetails.language);

HTML文件

<div class="form-group col-sm-6">
    <label>Preferred language</label>
    <select class="form-control" name="right" ng-model="signinDetails.language" ng-init="signinDetails.language = options.languages[0]" ng-options="l as l.language for l in options.languages"><option></option>
    </select>
</div>

已经有一个好的解决方案,它能够解决 OP 的问题并得到了认可。 - L. Guthardt

0

JS:

$scope.options = [
  {
    name: "a", 
    id: 1 
  },
  {
    name: "b",
    id: 2 
  }
];
$scope.selectedOption = $scope.options[1];

0

这是我用来设置选定值的代码

countryList: any = [{ "value": "AF", "group": "A", "text": "Afghanistan"}, { "value": "AL", "group": "A", "text": "Albania"}, { "value": "DZ", "group": "A", "text": "Algeria"}, { "value": "AD", "group": "A", "text": "Andorra"}, { "value": "AO", "group": "A", "text": "Angola"}, { "value": "AR", "group": "A", "text": "Argentina"}, { "value": "AM", "group": "A", "text": "Armenia"}, { "value": "AW", "group": "A", "text": "Aruba"}, { "value": "AU", "group": "A", "text": "Australia"}, { "value": "AT", "group": "A", "text": "Austria"}, { "value": "AZ", "group": "A", "text": "Azerbaijan"}];
 
 
 for (var j = 0; j < countryList.length; j++) {
      //debugger
      if (countryList[j].text == "Australia") {
          console.log(countryList[j].text); 
          countryList[j].isSelected = 'selected';
      }
      }
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.7.5/angular.min.js"></script>
<label>Country</label>
<select class="custom-select col-12" id="Country" name="Country"   >
<option value="0" selected>Choose...</option>
<option *ngFor="let country of countryList" value="{{country.text}}" selected="{{country.isSelected}}"   > {{country.text}}</option>
</select>

在 Angular 框架上尝试一下这个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接