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


139

我正在使用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"要选择的控件?


5
<option value="0" ng-selected="true">set of 6 traits</option>
Muhammad Shahzad

Answers:


191

希望我能理解您的问题,但是该ng-model指令在控件中的所选项目和的值之间创建了双向绑定item.selectedVariant。这意味着更改item.selectedVariantJavaScript或更改控件中的值会更新另一个。如果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名称与控件所在的位置相同。我应该在此设置selectedVariant还是直接在控件上设置?
themhz

通常,您将在控制器中的$scope变量上设置这些内容。因此,假设您处于单个作用域中,则可以在控制器中说出来$scope.item.selectedVariant = 0设置默认的选定值。您还可以使用ng-init指令直接在HTML控件上设置变量,但是在我看来,这很混乱!
SteveKlösters'13

您能详细说明一下variants您的范围吗?您必须将设置item.selectedVariantvariants
SteveKlösters'13

$ scope.item.selectedVariant = 0; 如果我将其放在控制文件中
则会

您可以使用ng-init提供语法吗?
themhz

34

我不知道这是否会帮助任何人,但是由于我面临着同样的问题,我想分享如何获得解决方案。

您可以在中使用track by属性ng-options

假设您有:

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

大。为了动态地做到这一点,我错过了跟踪。
约翰

最后!我的问题通过跟踪解决了。谢谢
Kishan

这就是我所缺少的!我正在设置ngModel正确绑定的作用域字段,但是直到我添加track by!才起作用。谢谢!
Cindy K.19年

7

如果将值分配为0,item.selectedVariant则应自动选择。在http://docs.angularjs.org/api/ng.directive:select上查看示例,默认情况下,只需分配即可选择红色$scope.color='red'


我在哪里设置item.selectedVariant?如果我定义$ scope.item.selectedVariant = 0; 在文件的控制中,角度破裂
他们

3
您还可以粘贴匹配的html吗?
TadeuszWójcik'13年

我认为orderGrid中的每个项目都必须将selectedVariant设置为0
TadeuszWójcik'13

您可以提供示例代码吗?我不熟悉棱角抱歉
他们

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

2

简单的方法

如果您有一个作为响应的用户或定义的数组/ JSON,则首先需要在控制器中设置选定的值,然后在html中放置相同的模型名称。我写的这个例子以最简单的方式解释。 控制器内部的
简单示例

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

您的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 list选项执行rest-request之后。但是未设置选择的选项。由于未知原因,影子$ digest执行中的AngularJS不会按其选择进行绑定选择。我必须使用JQuery来设置选择。重要!阴影中的角向ng-repeat optinos生成的attr“值”的值添加前缀。对于int,它是“数字:”。

$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 '18年

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>

在有角度的框架上尝试


0

JS:

$scope.options = [
  {
    name: "a", 
    id: 1 
  },
  {
    name: "b",
    id: 2 
  }
];
$scope.selectedOption = $scope.options[1];
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.