ngOptions 中的重复项
Duplicates in ngOptions
我正在使用 AngularJS 版本 1.4.7
并且有一个包含对象数组的简单 AngularJS 控制器。我想通过 ngOptions
.
在 select 中将这些对象显示为选项
问题是每个对象都是重复的,我不知道为什么。此副本仅出现在 select 中,源对象看起来不错。
angular
.module('demo', [])
.controller('DemoCtrl', DemoCtrl);
function DemoCtrl() {
var vm = this;
vm.demoOptions = [
{value: 1, label: 'Demo 1'},
{value: 2, label: 'Demo 2'},
{value: 3, label: 'Demo 3'}
];
vm.selected = null;;
}
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular.min.js"></script>
<div ng-app="demo" ng-controller="DemoCtrl as vm">
<select ng-options="item as item.label for item in vm.demoOptions track by item.value" ng-model="vm.selected">
<option value="" selected ng-if="vm.selected === null">-- select --</option>
</select>
<p ng-if="vm.selected !== null">Selected item: <code>{{vm.selected}}</code></p>
<p ng-if="vm.selected === null">No item is selected.</p>
<pre>vm.demoOptions == {{vm.demoOptions|json}}</pre>
</div>
这是一个错误吗?如何在不使用过滤器的情况下删除重复项?
注意:将 AngularJS 从版本 1.3.19
更新到 1.4.7
后出现此问题。我阅读了更新日志,但它只说明了添加 track by
- 我添加了它但没有效果。
您必须从 <select>
字段中删除 <option>
标签。由于其中的所有内容都将用于每个项目,并且 <option>
标签本身是通过 angularJS.
的指令生成的
angular
.module('demo', [])
.controller('DemoCtrl', DemoCtrl);
function DemoCtrl() {
var vm = this;
vm.demoOptions = [
{value: 1, label: 'Demo 1'},
{value: 2, label: 'Demo 2'},
{value: 3, label: 'Demo 3'}
];
vm.selected = null;;
}
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular.min.js"></script>
<div ng-app="demo" ng-controller="DemoCtrl as vm">
<select ng-options="item as item.label for item in vm.demoOptions track by item.value" ng-model="vm.selected" ng-change="vm.setSelected()">
</select>
<p ng-if="vm.selected !== null">Selected item: <code>{{vm.selected}}</code></p>
<p ng-if="vm.selected === null">No item is selected.</p>
<pre>vm.demoOptions == {{vm.demoOptions|json}}</pre>
</div>
angular
.module('demo', [])
.controller('DemoCtrl', DemoCtrl);
function DemoCtrl($scope) {
var vm = this;
vm.demoOptions = [
{value: null, label: '--select--'},
{value: 1, label: 'Demo 1'},
{value: 2, label: 'Demo 2'},
{value: 3, label: 'Demo 3'}
];
vm.selected = vm.demoOptions[0];
$scope.$watch(function(){ return vm.selected}, function(newVal, oldVal){
if(!oldVal.value && newVal.value) {
vm.demoOptions.shift();
}
});
vm.setSelected = function(){
}
}
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular.min.js"></script>
<div ng-app="demo" ng-controller="DemoCtrl as vm">
<select ng-options="item.label for item in vm.demoOptions" ng-model="vm.selected" ng-change="vm.setSelected()">
</select>
<p ng-if="vm.selected !== null">Selected item: <code>{{vm.selected}}</code></p>
<p ng-if="vm.selected === null">No item is selected.</p>
<pre>vm.demoOptions == {{vm.demoOptions|json}}</pre>
</div>
这是 1.4.x 的已知错误,在 1.4.8 之前您可以查看 issue。
如果您必须使用 angularjs 1.4.7 版本,那么您可以使用 ng-show
代替 ng-if
您可以从 angularjs github
中找到更改日志和错误
如果您在 1.4.8 或更高版本中遇到此问题,原因可能是 this bug。使用 $compile
时可以创建重复项。错误页面上有一些解决方法。
我正在使用 AngularJS 版本 1.4.7
并且有一个包含对象数组的简单 AngularJS 控制器。我想通过 ngOptions
.
问题是每个对象都是重复的,我不知道为什么。此副本仅出现在 select 中,源对象看起来不错。
angular
.module('demo', [])
.controller('DemoCtrl', DemoCtrl);
function DemoCtrl() {
var vm = this;
vm.demoOptions = [
{value: 1, label: 'Demo 1'},
{value: 2, label: 'Demo 2'},
{value: 3, label: 'Demo 3'}
];
vm.selected = null;;
}
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular.min.js"></script>
<div ng-app="demo" ng-controller="DemoCtrl as vm">
<select ng-options="item as item.label for item in vm.demoOptions track by item.value" ng-model="vm.selected">
<option value="" selected ng-if="vm.selected === null">-- select --</option>
</select>
<p ng-if="vm.selected !== null">Selected item: <code>{{vm.selected}}</code></p>
<p ng-if="vm.selected === null">No item is selected.</p>
<pre>vm.demoOptions == {{vm.demoOptions|json}}</pre>
</div>
这是一个错误吗?如何在不使用过滤器的情况下删除重复项?
注意:将 AngularJS 从版本 1.3.19
更新到 1.4.7
后出现此问题。我阅读了更新日志,但它只说明了添加 track by
- 我添加了它但没有效果。
您必须从 <select>
字段中删除 <option>
标签。由于其中的所有内容都将用于每个项目,并且 <option>
标签本身是通过 angularJS.
angular
.module('demo', [])
.controller('DemoCtrl', DemoCtrl);
function DemoCtrl() {
var vm = this;
vm.demoOptions = [
{value: 1, label: 'Demo 1'},
{value: 2, label: 'Demo 2'},
{value: 3, label: 'Demo 3'}
];
vm.selected = null;;
}
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular.min.js"></script>
<div ng-app="demo" ng-controller="DemoCtrl as vm">
<select ng-options="item as item.label for item in vm.demoOptions track by item.value" ng-model="vm.selected" ng-change="vm.setSelected()">
</select>
<p ng-if="vm.selected !== null">Selected item: <code>{{vm.selected}}</code></p>
<p ng-if="vm.selected === null">No item is selected.</p>
<pre>vm.demoOptions == {{vm.demoOptions|json}}</pre>
</div>
angular
.module('demo', [])
.controller('DemoCtrl', DemoCtrl);
function DemoCtrl($scope) {
var vm = this;
vm.demoOptions = [
{value: null, label: '--select--'},
{value: 1, label: 'Demo 1'},
{value: 2, label: 'Demo 2'},
{value: 3, label: 'Demo 3'}
];
vm.selected = vm.demoOptions[0];
$scope.$watch(function(){ return vm.selected}, function(newVal, oldVal){
if(!oldVal.value && newVal.value) {
vm.demoOptions.shift();
}
});
vm.setSelected = function(){
}
}
<script src="//cdnjs.cloudflare.com/ajax/libs/angular.js/1.4.7/angular.min.js"></script>
<div ng-app="demo" ng-controller="DemoCtrl as vm">
<select ng-options="item.label for item in vm.demoOptions" ng-model="vm.selected" ng-change="vm.setSelected()">
</select>
<p ng-if="vm.selected !== null">Selected item: <code>{{vm.selected}}</code></p>
<p ng-if="vm.selected === null">No item is selected.</p>
<pre>vm.demoOptions == {{vm.demoOptions|json}}</pre>
</div>
这是 1.4.x 的已知错误,在 1.4.8 之前您可以查看 issue。
如果您必须使用 angularjs 1.4.7 版本,那么您可以使用 ng-show
代替 ng-if
您可以从 angularjs github
中找到更改日志和错误如果您在 1.4.8 或更高版本中遇到此问题,原因可能是 this bug。使用 $compile
时可以创建重复项。错误页面上有一些解决方法。