AngularJS 1.4.8 - select 中的 ngOptions - 当我在 ngOptions 中的选项之前以编程方式设置模型时无限 $digest() 循环
AngularJS 1.4.8 - ngOptions in a select - infinite $digest() loop when I programmatically set model before option is in ngOptions
我在从 1.2.14 迁移到 1.4.8 时遇到了这个问题。这在 1.2.14 中工作正常,但我在 1.4.8 中得到一个无限的 $digest() 循环。这是一个 Fiddle 演示问题。 Fiddle 比这个 post 更容易看,但是 SO 让我包含代码
我有一个 select
元素,如下所示:
<select ng-model="selectedId" ng-options="opt.id as opt.label for opt in getOptions()">
我的选项是对象,像这样:
$scope.options = [ { id: 1, label: 'one' }, { id: 2, label: 'two' } ];
我想为 ngOptions 指令提供的选项数组取决于条件;有时我只想给它 $scope.options
,但有时我想包括另一个选项。
$scope.getOptions = function() {
if ($scope.showThirdOption)
return [{ id: 3, label: 'three' }].concat($scope.options);
else
return $scope.options;
};
现在,如果我以编程方式将我的模型设置为 3:
...
$scope.selectedId = 3;
...
...Angular 不会感到沮丧,即使该选项不存在。它只是将 <option>
节点添加到 <select>
元素:<option value="?" selected="selected"></option>
并且下拉列表中的选定值显示为空白。
但是如果我然后设置我的状态 s.t。我的 getOptions() returns 附加选项:
...
$scope.selectedId = 3;
$scope.showThirdOption = true;
...
...我得到一个无限的 $digest() 循环。
有什么好的方法可以避免这样的问题吗?您认为这是 Angular 中的错误(从技术上讲是回归),还是这只是……我不应该使用 ngOptions 的方式?
~~~ Again, I have a nice Fiddle for you to play around with!! ~~~
错误是因为你在ng-options中调用了函数getOptions()。创建新变量并分配此函数返回的值,然后在 ng-options 中使用它:
$scope.newOptions = $scope.getOptions();
ng-options="opt.id as opt.label for opt in newOptions"
另外不要忘记在单击按钮时更新新选项。
那你就没有无限的摘要了。
查看更新后的 fiddle:http://jsfiddle.net/bbcjeuhb/
我在从 1.2.14 迁移到 1.4.8 时遇到了这个问题。这在 1.2.14 中工作正常,但我在 1.4.8 中得到一个无限的 $digest() 循环。这是一个 Fiddle 演示问题。 Fiddle 比这个 post 更容易看,但是 SO 让我包含代码
我有一个 select
元素,如下所示:
<select ng-model="selectedId" ng-options="opt.id as opt.label for opt in getOptions()">
我的选项是对象,像这样:
$scope.options = [ { id: 1, label: 'one' }, { id: 2, label: 'two' } ];
我想为 ngOptions 指令提供的选项数组取决于条件;有时我只想给它 $scope.options
,但有时我想包括另一个选项。
$scope.getOptions = function() {
if ($scope.showThirdOption)
return [{ id: 3, label: 'three' }].concat($scope.options);
else
return $scope.options;
};
现在,如果我以编程方式将我的模型设置为 3:
...
$scope.selectedId = 3;
...
...Angular 不会感到沮丧,即使该选项不存在。它只是将 <option>
节点添加到 <select>
元素:<option value="?" selected="selected"></option>
并且下拉列表中的选定值显示为空白。
但是如果我然后设置我的状态 s.t。我的 getOptions() returns 附加选项:
...
$scope.selectedId = 3;
$scope.showThirdOption = true;
...
...我得到一个无限的 $digest() 循环。
有什么好的方法可以避免这样的问题吗?您认为这是 Angular 中的错误(从技术上讲是回归),还是这只是……我不应该使用 ngOptions 的方式?
~~~ Again, I have a nice Fiddle for you to play around with!! ~~~
错误是因为你在ng-options中调用了函数getOptions()。创建新变量并分配此函数返回的值,然后在 ng-options 中使用它:
$scope.newOptions = $scope.getOptions();
ng-options="opt.id as opt.label for opt in newOptions"
另外不要忘记在单击按钮时更新新选项。
那你就没有无限的摘要了。 查看更新后的 fiddle:http://jsfiddle.net/bbcjeuhb/