2016-11-17 90 views
1

当我在select中使用ng-options循环列表并生成我的下拉列表时,是否可以将动态属性id添加到option?它工作,如果我使用ng-repeat循环,因为我可以将attribut id直接放在option标签中,并用$index递增。这也可能与ng-options?这里是我的代码:在ng选项中添加动态ID到选项

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用):

enter image description here

任何想法?谢谢。

+2

对于'ng-options',你只能设置'option'的'text'和'value'而不是'id'。 – Aruna

+0

@Aruna好吧我期待这样的答案 - 谢谢。 :-) – MrBuggy

+0

@Aruna如何修改ng选项循环中的值?目前,每个选项的值为0-5(请参见屏幕截图)。我可以在那里设置一个文本,并像ng-repeat一样用$ index增加它?谢谢 – MrBuggy

回答

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" 
}, ]; 
+0

你能制作一段代码吗?我试图更新我的,但它打印我一些错误,我的下拉与ng选项循环是空的。 – MrBuggy

+0

真的老兄? ...看我的编辑。 – trichetriche

+0

我只是修改它以适应您的需求。看到第二个'选择'并检查它了解。如果你不这样做,请在下面评论,我会做另一个编辑来解释它。 – trichetriche

1

请看下面的答案。

Angular将总是呈现从0开始的index的值。不要担心这一点。由于它将有内部参考,并会相应地更新模态。

我已在下面放置了一个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>

+0

嗨,谢谢你的回答。我确实需要的是,value属性中的文本选项_ {{$ index}},因此它将是:value =“option_1”等等。我需要一些编码的UI测试。这是否可以修改attribut值中的字符串?目前它仍然是0到4自动..? – MrBuggy

0

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>

+0

如果你再次读到我的问题,我已经有了ng-repeat的解决方案,但是如果可能的话,我需要和ng-options一样的东西......所以这不是我真正需要的答案。 – MrBuggy