【问题标题】:Add dynamic id to option in ng-options在 ng-options 中为选项添加动态 id
【发布时间】:2017-03-31 16:28:24
【问题描述】:

当我在select 中使用ng-options 循环我的列表并生成我的下拉列表时,是否可以将动态属性id 添加到option?如果我使用ng-repeat 循环,它会起作用,因为在那里我可以将属性id 直接放在option 标记中,并用$index 递增它。 ng-options 也可以这样做吗?这是我的代码:

angular.module("myApp", []).controller("myController", function($scope) {
  $scope.selectedOption1;
  $scope.selectedOption2;

  $scope.myList = [{
    text: "1"
  }, {
    text: "2"
  }, {
    text: "3"
  }, {
    text: "4"
  }, {
    text: "5"
  }, ];
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="myApp" ng-controller="myController">
  <!--BUILD DROPDOWN WITH NG-OPTIONS LOOP-->
  <select ng-model="selectedOption" ng-options="option as option.text for option in myList"></select>

  <!--BUILD DROPDOWN AND SET ATTRIBUT ID WITH NG-REPEAT LOOP-->
  <select ng-model="selectedOption2">
    <option id="option_{{$index}}" ng-repeat="option in myList">{{option.text}}</option>
  </select>
</div>

select 的屏幕截图(红色边框是 id):

有什么想法吗?谢谢。

【问题讨论】:

  • 使用ng-options,您只能设置optiontextvalue,而不能设置id
  • @Aruna 好的,我期待这样的答案 - 谢谢。 :-)
  • @Aruna 如何修改 ng-options 循环中的值?目前,每个选项都有一个 0-5 的值(见屏幕截图)。我可以在那里设置一个文本并像在 ng-repeat 中那样用 $index 递增它吗?谢谢
  • 是的,你可以,我会发布这个答案:-)
  • @Aruna 非常好,谢谢!

标签: html angularjs select ng-options


【解决方案1】:

请看下面的答案。

Angular 将始终将值呈现为index,从0 开始。不要担心这个。因为它将有一个内部引用,并会相应地更新模态。

我在下方放置了一个span 以查看所选项目的value

angular.module("myApp", []).controller("myController", function($scope) {
  $scope.selectedOption1;
  $scope.selectedOption2;

  $scope.myList = [{
    text: "1"
  }, {
    text: "2"
  }, {
    text: "3"
  }, {
    text: "4"
  }, {
    text: "5"
  }, ];
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="myApp" ng-controller="myController">
  <!--BUILD DROPDOWN WITH NG-OPTIONS LOOP-->
  <select ng-model="selectedOption" ng-options="('option_' + (myList.indexOf(option) + 1)) as option.text for option in myList"></select>
  <br/><br/>
  Selected: <span><b>{{selectedOption}}</b></span>

</div>

【讨论】:

  • 您好,感谢您的回答。我真正需要的是 value 属性中的文本 option_{{$index}},因此它将是:value="option_1" 等等。我需要它来进行一些编码的 ui 测试。这是否可以准确地修改值属性中的字符串?目前还是自动0到4..?
【解决方案2】:

您可以使用track by 选项:

<select ng-model="selectedOption" ng-options="obj.text for obj in myList track by obj.value">

但是,你必须稍微修改你的对象:

$scope.myList = [{
    text: "1",
    value: "option_1"
}, {
    text: "2",
    value: "option_2"
}, {
    text: "3",
    value: "option_3"
}, {
    text: "4",
    value: "option_4"
}, {
    text: "5",
    value: "option_5"
}, ];

这应该可以解决问题。

编辑 The plunker to test it

EDIT 2对于那些想要快速回答的人,您也可以这样做:

<select ng-model="selectedOption" ng-options="obj.text for obj in myList track by option + obj.text">

并在js文件中添加:

$scope.option = 'option_';
$scope.myList = [{
    text: "1"
}, {
    text: "2"
}, {
    text: "3"
}, {
    text: "4"
}, {
    text: "5"
}, ];

【讨论】:

  • 你能做一个代码sn-p吗?我试图更新我的,但它打印了一些错误,并且我的 ng-options 循环下拉列表是空的..
  • 我刚刚对其进行了修改以满足您的需求。请参阅第二个select 并检查它以了解。如果您不这样做,请在下面发表评论,我将进行另一次编辑以向您解释。
【解决方案3】:

angular.module("myApp", []).controller("myController", function($scope) {
  $scope.selectedOption1;
  $scope.selectedOption2;

  $scope.myList = [{
    text: "1"
  }, {
    text: "2"
  }, {
    text: "3"
  }, {
    text: "4"
  }, {
    text: "5"
  }, ];
});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="myApp" ng-controller="myController">
    
<select ng-model="selectedOption2">
 <option ng-repeat="d in myList track by $index" ng-value="'Option_'+($index+1)">
   {{d.text}}
 </option>
  
</select>
  {{selectedOption2}}
</div>

【讨论】:

  • 如果您再次阅读我的问题,我已经有了 ng-repeat 这样的解决方案,但如果可能的话,我需要与 ng-options 相同的解决方案......所以这不是我真正需要的答案..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-30
  • 2014-12-12
  • 2016-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多