AngularJS: 当 属性 源对象改变时刷新 ng-options

AngularJS: refresh ng-options when property source object changes

完整描述: 我有多个属性的选项列表(不仅仅是键值对):

[
  {
    id: 1,
    name: "111",
    some: "qqq"
  },
  {
    id: 2,
    name: "222",
    some: "www"
  }
];

而select定义为:

<select name="mySelect" id="mySelect"
  ng-options="option.name for option in opts track by option.id"
  ng-model="mod1"></select>

根据应用逻辑,额外的 属性 可能会发生变化:

{
  id: 2,
  name: "222",
  some: "www1"
}

但 Select 中的实际列表没有改变! 但是,如果名称更改,则将刷新整个选项列表。

简而言之,您可以在 JSFiddle OR JSFiddle 上看到演示。我准备了两个非常相似的例子:

  1. 单击按钮时仅额外 属性 更新
  2. 单击按钮时 - 额外 属性 和键都会收到新值

有人知道解决办法吗?

更新

现在我正在用 update + delay + update 解决方案解决这个问题:

this.click = function(){
  $scope.opts = {};
  $timeout(function() {
    $scope.opts = { /* NEW OBJECT */};
  }, 0);
}

好的,所以我 认为 我明白你想要什么,那就是能够 select 一个选项,其嵌套值可能在列表呈现后发生了变化在 DOM.

基于这种理解,我相信我创建的 plunker 为您提供了解决方案。如果您 select 选项之一,并更改输入字段中的子值,双向绑定将更新模型。

基本上,它采用用户 selection,并根据 select 更改,重新分配 selected 对象以引用选项数组中的原始选项。这将允许双向绑定发生。如果您查看代码,您会看到输入字段正在更新选项列表本身 ($scope.options),其中显示的模型是 $scope.formData.model.

https://plnkr.co/edit/DLhI7t7XBw9EbIezBCjI?p=preview

HTML

<select 
  name="mySelect"
  id="mySelect"
  ng-model="formData.model"
  ng-change="onChange(formData.model)"
  ng-options="option.name for option in options track by option.id"></select>

  SELECTED CHILD: {{formData.model.child.name}}

<hr>

<div ng-repeat="option in options">
  Child Name for {{ option.name }}: <input ng-model="option.child.name">
</div>

JS

  $scope.onChange = function(option) {

    angular.forEach($scope.options,function(optionItem){
      if (optionItem.id == option.id){
         $scope.formData.model = optionItem;
      }
    })


  }

  $scope.options = [
    {
      id: 1,
      name: "111",
      child: {
        id: 11,
        name: "111-1"
      }
    },
    {
      id: 2,
      name: "222",
      child: {
        id: 22,
        name: "222-1"
      }
    }
  ];

  $scope.formData = {
    model: $scope.options[0]
  };

每当您想应用所做的更改时调用 $apply

$scope.$apply();

这将告诉 AngularJS 刷新。