使用 ng-repeat 和 'unique' 的问题
Problems using ng-repeat and 'unique'
我的问题是一个令人费解的问题。当我使用 ng-repeat
重复我的数据以创建复选框时,它按我预期的方式工作。我会得到我提到的所有东西,它们有重复项。下面是一个片段。
<label ng-if="project.score !='0'" data-ng-repeat="project in projects | unique:'c.projectRef' | orderBy:'c.projectRef'">
<input
id="project.c.projectRef"
type="checkbox"
ng-click="toggleSelection(project.c.projectRef)"
ng-checked="selectedRefs.indexOf(project.c.projectRef) > -1" />
<span>{{project.c.projectRef}}</span>
</label>
如您所见,'unique' 就在那里,我正在为此使用 Angular UI。有许多重复引用,因为我将复选框用作过滤器,所以我只想要不同的复选框,而不是与引用次数一样多的复选框,这就是 ng-repeat
单独做的事情。
它的功能与我删除 unique 完全一样,但是当我有 unique 时,发生的事情不是给我几个都是唯一的复选框,而是给我一个复选框。
从我一直在测试的情况来看,当您引用(抱歉,我不知道它的术语)数据时,当您对数据有更深入的引用时,似乎会发生这种情况,因此 project.c.projectRef
而不是project.projectRef
。
我被这个问题难住了,因此非常感谢任何修复以及有关该问题的信息。
其实是我怀疑的。 Angular UI 不喜欢嵌套引用,您必须编辑 angular-ui.js 文件并用此添加替换唯一函数。
.filter('unique', function () {
return function (items, filterOn) {
if (filterOn === false) {
return items;
}
if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) {
var hashCheck = {}, newItems = [];
var extractValueToCompare = function (item) {
if (angular.isObject(item) && angular.isString(filterOn)) {
var resolveSearch = function(object, keyString){
if(typeof object == 'undefined'){
return object;
}
var values = keyString.split(".");
var firstValue = values[0];
keyString = keyString.replace(firstValue + ".", "");
if(values.length > 1){
return resolveSearch(object[firstValue], keyString);
} else {
return object[firstValue];
}
}
return resolveSearch(item, filterOn);
} else {
return item;
}
};
angular.forEach(items, function (item) {
var valueToCheck, isDuplicate = false;
for (var i = 0; i < newItems.length; i++) {
if (angular.equals(extractValueToCompare(newItems[i]), extractValueToCompare(item))) {
isDuplicate = true;
break;
}
}
if (!isDuplicate) {
if(typeof item != 'undefined'){
newItems.push(item);
}
}
});
items = newItems;
}
return items;
我的问题是一个令人费解的问题。当我使用 ng-repeat
重复我的数据以创建复选框时,它按我预期的方式工作。我会得到我提到的所有东西,它们有重复项。下面是一个片段。
<label ng-if="project.score !='0'" data-ng-repeat="project in projects | unique:'c.projectRef' | orderBy:'c.projectRef'">
<input
id="project.c.projectRef"
type="checkbox"
ng-click="toggleSelection(project.c.projectRef)"
ng-checked="selectedRefs.indexOf(project.c.projectRef) > -1" />
<span>{{project.c.projectRef}}</span>
</label>
如您所见,'unique' 就在那里,我正在为此使用 Angular UI。有许多重复引用,因为我将复选框用作过滤器,所以我只想要不同的复选框,而不是与引用次数一样多的复选框,这就是 ng-repeat
单独做的事情。
它的功能与我删除 unique 完全一样,但是当我有 unique 时,发生的事情不是给我几个都是唯一的复选框,而是给我一个复选框。
从我一直在测试的情况来看,当您引用(抱歉,我不知道它的术语)数据时,当您对数据有更深入的引用时,似乎会发生这种情况,因此 project.c.projectRef
而不是project.projectRef
。
我被这个问题难住了,因此非常感谢任何修复以及有关该问题的信息。
其实是我怀疑的。 Angular UI 不喜欢嵌套引用,您必须编辑 angular-ui.js 文件并用此添加替换唯一函数。
.filter('unique', function () {
return function (items, filterOn) {
if (filterOn === false) {
return items;
}
if ((filterOn || angular.isUndefined(filterOn)) && angular.isArray(items)) {
var hashCheck = {}, newItems = [];
var extractValueToCompare = function (item) {
if (angular.isObject(item) && angular.isString(filterOn)) {
var resolveSearch = function(object, keyString){
if(typeof object == 'undefined'){
return object;
}
var values = keyString.split(".");
var firstValue = values[0];
keyString = keyString.replace(firstValue + ".", "");
if(values.length > 1){
return resolveSearch(object[firstValue], keyString);
} else {
return object[firstValue];
}
}
return resolveSearch(item, filterOn);
} else {
return item;
}
};
angular.forEach(items, function (item) {
var valueToCheck, isDuplicate = false;
for (var i = 0; i < newItems.length; i++) {
if (angular.equals(extractValueToCompare(newItems[i]), extractValueToCompare(item))) {
isDuplicate = true;
break;
}
}
if (!isDuplicate) {
if(typeof item != 'undefined'){
newItems.push(item);
}
}
});
items = newItems;
}
return items;