2016-11-28 3 views
2

Я работаю с угловыми, и я пытаюсь создать кнопку «Выбрать все».indexof - проверить, есть ли значение в массиве с javascript)

У меня есть список элементов, каждый элемент имеет переключатель, а то, что я делаю, при изменении (каждый раз, когда переключатель изменяется от истинного (выбранного) до значения false (не выбрано), я запускаю функцию для создания массива со всеми идентификаторами выбранных элементов.

Это работает почти идеально, проблема в том, что я столкнулся некоторые проблемы с методом indexfOf, чтобы проверить, если ID уже в массиве.

var isInArray; 

isInArray = function(arr, id) { 
    console.log("index of ", arr.indexOf(id)); 
    return arr.indexOf(id); 
}; 


scope.evtSelectAll = function() { 
    return angular.forEach(scope.listToDisplay, function(element) { 
    element.copyTo = true; 
    return scope.selectFromList(element.iID, element.copyTo); 
    }); 
}; 

scope.selectFromList = function(id, copy) { 
    if (copy === true && isInArray(scope.selected, id) === -1) { 
    scope.selected.push(id); 
    } else { 
    scope.selected.pop(id); 
    } 
    console.log("scope.selected - ", scope.selected); 
    if (scope.selected.length > 0) { 
    console.log("Emitted event: can proceed!"); 
    scope.$emit('enough-elements'); 
    } else { 
    console.log("Emitted event: can not proceed!"); 
    scope.$emit('not-enough-elements'); 
    } 
    return scope.result = scope.selected; 
}; 

в проблема у меня есть, когда массив (scope.selected) имеет несколько идентификаторов.

Допустим, например, что мои scope.selected выглядит следующим образом:

scope.selected = [2,3,4,7] 

, если я нажму на выбор все, ничего не добавляется (и это правильно)

Теперь, скажем, я снимите галочку 4 и 7, например, и мой scope.selected теперь выглядит следующим образом:

scope.selected = [2,3] 

Если я теперь нажать на выбор, мой результат состоит в следующем: [2,4,7].

Я потерять

Я думаю, что это связано с тем, что мой массив не имеет один единственный пункт?

благодарит за любую помощь. Вот также быстрый codepen, чтобы объяснить проблему. Если вы проверите консоль и поиграете с помощью переключателей, вы сможете сразу увидеть, о чем я говорю.

Заранее спасибо

+2

Будет ли проблема пустым значением $ scope.slected полностью и воссоздать его, переписав отмеченные элементы в списке, как только произойдет переключение? –

+0

Нет, я не понимаю, почему это должно быть честью. Мне просто нужно быть осторожным, чтобы опорожнить его только при выборе всего, что я предполагаю, правильно? – Nick

+1

, по крайней мере, в примере codepen, 'element.iID' следует изменить на' element.id' – Matthias

ответ

1

Matthias и Christian Bonato за их предложения.

В конце концов, я решил использовать оба их предложения, и конечный результат, похоже, работает должным образом.

Вот codepen с окончательной версии: http://codepen.io/NickHG/pen/KNXPBb

В принципе, я изменил

scope.selected.pop(id); 

с

$scope.selected.splice(isInArray($scope.selected, id),1); 

и в функции SelectAll событий, я всегда пустой scope.selected[] перед добавлением элементов к матрице

$scope.evtSelectAll = function() { 
$scope.selected = [] 
angular.forEach($scope.list, function(element) { 
    element.copyTo = true; 
    return $scope.selectFromList(element.id, element.copyTo); 
}); 

};

Благодарим за помощь!

+1

опорожнение массива кажется хорошим решением проблемы здесь, хорошая работа – Matthias

+0

не забудьте принять ваш ответ как решение – Matthias

+0

Я могу принять только через два дня. Я соглашусь, как только смогу. спасибо – Nick

0

Я думаю, что в основном ваш код содержит логическую ошибку. Вы используете функцию selectFromList для отмены выбора (когда выполняется отдельно) и для выбора всех (которые вы не хотите использовать для отмены выбора).

Как кто-то указал в течение какой-то причине в настоящее время удален ответ, функция pop.() не должна вызываться с любыми аргументами (это только для удаления последнего элемента), вы должны использовать сращивания так: $scope.selected.splice(isInArray($scope.selected, id),1);

если вам действительно нужно излучаемый функциональность для запуска на выбор все, вы можете попробовать, если это ответ для вас:

var isInArray; 

isInArray = function(arr, id) { 
    console.log("index of ", arr.indexOf(id)); 
    return arr.indexOf(id); 
}; 


scope.evtSelectAll = function() { 
    return angular.forEach(scope.listToDisplay, function(element) { 
    element.copyTo = true; 
    if (isInArray($scope.selected, element.id) === -1) { 
     $scope.selected.push(element.id); 
    } 
    }); 
}; 

scope.selectFromList = function(id, copy) { 
    if (copy === true && isInArray(scope.selected, id) === -1) { 
    scope.selected.push(id); 
    } else { 
    $scope.selected.splice(isInArray($scope.selected, id), 1); 
    } 
    console.log("scope.selected - ", scope.selected); 
    if (scope.selected.length > 0) { 
    console.log("Emitted event: can proceed!"); 
    scope.$emit('enough-elements'); 
    } else { 
    console.log("Emitted event: can not proceed!"); 
    scope.$emit('not-enough-elements'); 
    } 
    return scope.result = scope.selected; 
}; 

Теперь выберите все только добавляет scope.selected, если он не находит идентификатор в списке scope.selected.

+0

Спасибо за ответ. Я добавил вашу строку, и я изменил функцию select all, чтобы включить первый комментарий (пустая область. Selected, когда я нажимаю на select all), и с двумя комбинированными решениями, этот шов работает так, как мне нужно. Большое спасибо – Nick

Смежные вопросы