8

这是我在视图中选择的 ui:

<ui-select ng-model="selectedLabel.selected" ng-disabled="fetchingLabels || working">
    <ui-select-match placeholder="">{{$select.selected.code}}</ui-select-match>
    <ui-select-choices repeat="label in labels| filterBy: ['name', 'code']: $select.search"> 
        <div ng-bind-html="label.code | highlight: $select.search"></div>
        <small ng-bind-html="label.name | highlight: $select.search"></small>
    </ui-select-choices>
</ui-select>

这是我的控制器中的相关代码:

$scope.labels = [];
$scope.selectedLabel = {};
$scope.selectedLabel.selected = $scope.passedLabel; // This is an object passed 
                                                    // from the previous controller.
                                                    // The scope comes with it.


$scope.fetchLabels(); // This fetches the labels from the server
                      // and puts them in $scope.labels

从服务器带来的标签理论上是这样的:

[{'labelId': 20, 'code': 'L20', 'name': 'some label'},
 {'labelId': 21, 'code': 'L21', 'name': 'other label'}, ...]

并且从外部传递的标签“passedLabel”在理论上也类似于其中之一$scope.labels,例如:

  passedLabel = {'labelId': 21, 'code': 'L21', 'name': 'other label'}


...我从理论上说是因为,从经验上看,我看到它们是不同的,因为 Angular 给它们添加了一些东西(例如$$hashKey,或__proto__)。

因此,由于这种差异$scope.selectedLabel.selected = $scope.passedLabel与 ui-select 中的相应项目不匹配(它们不是同一个对象),因此,结果就是这种行为:

带有初始选择的 ui-select 行为

如何正确设置初始选择?有没有办法可以使用 id 而不是对象比较?我想避免for这样:

  for (i=0; i<$scope.labels; i++) {
      if ($scope.labels[i].labelId == $scope.passedLabel.labelId) {
           $scope.selectedLabel.selected = $scope.labels[i]
      }
  }

我很确定它会按预期工作,但我必须for在 ajax 返回后调用它......而且我还有其他 ui-selects

4

1 回答 1

5

如果您想达到您提到的状态,那么只需将正确的引用传递给您的模型。

因此,在 fetchlabel 调用成功后,您可以设置标签中的值。现在在这个函数的成功中,你需要调用 fetches 的函数presentLabel

一旦获得当前标签的数据,您就可以在标签范围内获得该对象的索引。

var idx;
_.find($scope.labels, function(label, labelIdx){ 
  if(label.labelId == parentLabel.labelId){ idx = labelIdx; return true;}; 
});

$scope.selectedLabel = {};
$scope.selectedLabel.selected = $scope.labels[idx];

这将解决您的目的。

于 2014-11-24T04:47:40.273 回答