Моя проблема - загадочная. Когда я использую 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>
Как вы можете видеть, здесь есть "уникальный", и для этого я использую Angular UI. Там много дубликатов ссылок, и поскольку я использую флажки в качестве фильтра, мне нужны только определенные флажки, а не столько флажков, сколько времен, на которые он ссылается, что будет делать только один ng-repeat
.
Он функционирует точно так же, как если бы я удалял уникальный, но когда у меня было уникальное в том, что происходит, вместо того, чтобы давать мне несколько флажков, которые являются уникальными, он просто дает мне один флажок.
Из того, что я тестировал, похоже, это происходит, когда вы ссылаетесь на (извините, что я не знаю термин для него), когда у вас есть более глубокие ссылки на него, поэтому project.c.projectRef
в отличие от project.projectRef
.
Я был в шоке от этой проблемы, поэтому любые исправления, а также информация по этому вопросу были бы весьма признательны.
На самом деле я подозревал. Угловой пользовательский интерфейс не любит вложенные ссылки, вам нужно отредактировать файл 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;