Javascript ngModel在ngOptions更改时未更新

Javascript ngModel在ngOptions更改时未更新,javascript,angularjs,Javascript,Angularjs,当ngOptions阵列更改时,如何防止angular更新ngModel?当ngOptions数组更改时,Angular似乎将ngModel设置为null .controller('myController', function($scope) { var vm = this; vm.options = []; vm.selected = null; vm.getOptions = function(id) { $http.get().done(f

当ngOptions阵列更改时,如何防止angular更新ngModel?当ngOptions数组更改时,Angular似乎将ngModel设置为null

.controller('myController', function($scope) {
    var vm = this;
    vm.options = [];
    vm.selected = null;
    vm.getOptions = function(id) {
        $http.get().done(function(response) {
            vm.options = response.data;
        });
    };
}
vm.selected=“1”

调用
vm.getOptions
时,将按预期重新填充select选项,但angular似乎将
vm.selected
设置为null

如何在
vm.options
更改后保持
vm.selected=“1”

编辑:

因此,我尝试在设置了
vm.options
之后设置
vm.selected
,但在控制器代码运行之后,将
vm.selected
设置为null

所以我试着做:

$timeout(function(selected) {
   vm.selected = selected;
}, 0, true, vm.selected);
这将成功地将
vm.selected
设置为上一个值,但是视图不会更新

编辑:

html是:

<select name="myOption" ng-model="vm.selected"
    ng-options="option.id as option.name for option in vm.options track by option.id">
<option value="">Select an option</option>

选择一个选项


下面是一个示例。首先,选择一个选项,单击更新选项按钮。

由于选项更改时重置模型的请求很多,Angular已确保在版本>1.4的ng选项更改后重置模型值。但是,在Angular的旧版本中,这将继续发挥相同的作用

为了实现所需的功能,我建议您在选项上使用ng repeat,而不是在select上使用ng options

<select ng-model="vm.selected">
  <option value="">Select an option</option>
  <option ng-repeat="option in vm.options track by option.optionId" value="{{option.optionId}}">{{option.optionTitle}}</option>
</select>

选择一个选项
{{option.optionTitle}}
看看这个

希望这对你有帮助

在同一表达式中使用“选择为”和“跟踪方式”时要小心。

您正在使用id作为ngModel的值。您无法跟踪此选项的
选项。optionId
。您应该改为使用选项实例:

<select ng-model="vm.selected" 
        ng-options="option as option.optionTitle for option in vm.options track by option.optionId">
  <option value="">Select an option</option>
</select>

选择一个选项

vm.selected={{vm.selected}}
更新选项

这是其中一种情况,因为我没有将模型视为选项的对象,而是求助于所选选项的属性,所以我自己被烧死了

在vm.options更改后,如何保持vm.selected=“1”

所选的
vm.selected
是一个数字,而不是一个对象。它必须是一个对象,并且必须是
选项中的引用

我做了很小的改动来说明并使它起作用

首先
vm。选中的
通过以下更改将其视为对象。请注意,模型不再是optionId

ng-options="option as option.optionTitle for option in vm.options track by option.optionId"
第二,在控制器中,我们将模型初始化为对象和对选项的引用

vm.options = [{optionId: 1, optionTitle: "one"}, {optionId: 2, optionTitle: "two"}];
vm.selected = vm.options[1];

还修改了与optionId保持唯一性相关的其他更改。然而,这些变化并不能说明问题所在

更改
vm.options
后,需要指定
vm.selected
again@Ronnie查看我的更新显示使用
ng options
@Lex的HTML我添加了htmlI没有看到
vm.getOptions
在任何地方被引用。您使用的是较低版本的angular。这在版本>1中不受支持。4@NikhileshShivarathri我更新到了1.5.7,它可以正常工作。此问题记录在ngOptions文档页面上。我不知道你为什么认为它“不受支持”。抱歉@Hansmad,我没有注意到你正在将对象“选项”引用到模型中,是的,如果你正在引用对象,它会起作用。但这将限制开发人员将模型用作对象。请参考链接,这将向你解释我在说什么!这就是问题所在。如果新选项列表包含selectedOption,则在选项更改时,使用上述ng选项将保留selectedOption,否则会将selectedOption设置为null