【问题标题】:ng-option track by group name breaks the selectng-option track by group name 打破了选择
【发布时间】:2016-05-19 05:43:11
【问题描述】:

我有一个带有分组 ng 选项的下拉选择。用户应该能够在输入字段中动态更改组名的命名。在更改组名称值时,除非您进行新选择,否则不会更新 select 指令。

我通过按组名使用跟踪来解决此问题,但现在选择下拉菜单已损坏。请注意,您选择的选项不是实际选择的选项。

有没有办法同时拥有动态更新的组名和工作选择?

 <select ng-options="player.name group by player.team for player in players track by player.team" ng-model="systemType.tertiaryEquipment"></select>

这是 jsfiddle:http://jsfiddle.net/07woeam8/2/

【问题讨论】:

  • 您需要更改对象引用,而不仅仅是字符串值。
  • 你能举个例子吗?将不胜感激。
  • select dropdown is broken 是什么意思?您可以添加预期的输出吗?您的问题不清楚您的期望是什么。
  • 请注意,您选择的选项不是实际选择的选项。

标签: angularjs html-select ng-options angularjs-ng-options


【解决方案1】:

您有多种选择,但需要权衡取舍。

首先,弄乱您的选择的是track by 表达式,它不应该是player.team,因为您没有选择团队。它应该是player.name 或什么都没有。请记住,player.name 的跟踪将使select 对象中的组无法实时更新。

其次,如果您希望选项菜单中的组动态更改,您需要更改整个$scope.players 对象,而不仅仅是更改其中的字符串值。例如,您可以使用angular.copy

$scope.change = function() {
  var copy = angular.copy($scope.players);
  copy[0].team = 'betsdfhsk';
  $scope.players = copy;
};

这提出了您需要考虑的其他权衡。如果您没有在第一个选项中使用track by player.name,则完全更改对象引用也会使您选择的对象无效。

但这里有一个working fiddle

【讨论】:

  • 感谢您的回答。似乎第二种方法是要使用的方法。我会尝试一下,看看它是否有效,尽管它可能会导致我添加一些额外的循环。你知道为什么 Angular 会这样吗?
  • 你所说的“这样行事”是什么意思?对于track by 的事情,我认为这很明显 - 你告诉 Angular 按组跟踪选择,因此它无法区分同一组的不同对象。随着团队价值的改变,我猜 Angular 在数组上执行了浅层观察,而不是深层观察。
  • 抱歉不清楚。我的意思是为什么组名没有在 ng-options 中动态变化?
  • 所以就像我说的,我只能猜测 angular 对数组执行了浅表监视。也就是说,检查是否添加或删除了项目,但不检查现有对象是否已更改。
  • 例如,如果您的 change 函数将删除或添加对象到 players 数组,您会看到它立即添加到选择选项中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多