角度下拉列表不显示第一个值

时间:2015-12-03 15:23:19

标签: javascript angularjs

我尝试使用'name'按顺序排列列表中的第一项后初始化下拉选项,如下所示:

<h2 class="presentation site is-input-header">Site</h2>
<div class="modal-select-element">
  <select ng-model="selected_site"
          ng-init="selected_site = availableSites()[0]"
          ng-options="site.name for site in availableSites() | orderBy:'name'">
  </select>
</div>

但是,初始值只是一个随机选择的站点,而不是列表中的第一个名称。有没有办法在排序列表中显示第一项?

1 个答案:

答案 0 :(得分:2)

由于您已经使用函数availableSites()来填充ng-options数据,我建议您在函数中而不是使用ng-options对数据进行排序。它会更高效,并且应该避免你遇到的问题。

控制器:

$scope.availableSites() {
  var array = $scope.whateverMeansYouTookToGetYourDataFn();

  return array.sort(function(a,b){/* do your sorting or use lodash thats nice too */});
}

WHY:

你看到这种副作用的原因是因为availableSites()[0]正在抓取你的未排序数组的第一项,同时,orderBy将它们分类到任何视图顺序,而不是保证{{1}是排序后的第一个项目。

示例:

availableSites()[0]

var unsortedArrayFromController = [ { "name": "z" }, { "name": "b" }, { "name": "d" } ]

  

{name:z}

如果ng-options对此对象数组进行排序,则仍将选择名称为“z”的选项,但现在将以不同方式排序(比如说最后一次),因此不再需要成为下拉列表中的第一项。

此外:

旁注。我建议将unsortedArrayFromController[0]存储在与存储selected_site = availableSites()[0]功能相同的控制器中。 availableSites()指令仅用于需要为嵌套的ng-init ng-repeat本地人设置别名的特定情况。