2015-11-26 5 views
0

У меня есть массив значений, который я показываю с помощью ng-repeat. Когда я нажимаю на один из них, я добавляю это значение в другой массив. Если он уже существует, я удаляю его. Здесь хорошо работает. Но у меня есть кнопка, которая толкает весь массив во второй. Он работает, но я могу подтолкнуть весь массив бесконечно, даже если значение уже существует. Конечно, если я проверю одно или два значения, а затем нажимаю «Выбрать все», он должен выбрать все значения, которые уже выбирают с помощью одного выбора. По thge образом это код с jsfiddle:Удалить значение массива, если оно уже существует javascript

var myApp = angular.module('myApp',[]); 

function MyCtrl($scope) { 
    $scope.all_titles = [ 
     "Title 1", 
     "Title 2", 
     "Title 3", 
     "Title 4" 
     ]; 

    $scope.selection=[]; 

    $scope.getSelectedItem = function getSelectedItems(title) { 
      var idx = $scope.selection.indexOf(title); 
      // is currently selected 
      if (idx > -1) { 
       $scope.selection.splice(idx, 1); 
      } 
      // is newly selected 
      else { 
       if(Array.isArray(title)) { 
        for(var i=0;i<title.length;i++) { 
         $scope.selection.push(title[i]); 
        } 
       } else { 
        $scope.selection.push(title); 
       } 
      } 
     }; 
} 

<div ng-controller="MyCtrl"> 
    <div> 
     <button data-ng-click="getSelectedItem(all_titles)"> 
      Select all 
     </button> 
    </div> 
    <div ng-repeat="title in all_titles"> 
     <a ng-click="getSelectedItem(title)">{{title}}</a> 
    </div> 

    <hr> 
    <div> 
     {{selection}} 
    </div> 
</div> 

http://jsfiddle.net/HB7LU/20342/

+0

это то, что вы хотите? https://jsfiddle.net/L1Lf8yau/ не совсем понятно, как должна работать кнопка select all. –

+0

Совсем нет .. потому что таким образом, если вы нажмете один, а затем в «Выбрать все», он выбирает все, кроме выбранного вами ранее. –

ответ

2

Вы сценарий не совсем ясно для меня.

Если вы хотите выбрать все кнопки ведут себя как все ссылки нажмите, то это ваше решение:

$scope.getSelectedItem = function getSelectedItems(title) { 
      if(Array.isArray(title)) { 
       for(var i=0;i<title.length;i++) { 
        $scope.pushIt(title[i]); 
       } 
      } else { 
       $scope.pushIt(title); 
      } 

    }; 

$scope.pushIt = function pushIt(title) { 
     var idx = $scope.selection.indexOf(title); 
     // remove if already in array 
     if (idx > -1) { 
      $scope.selection.splice(idx, 1); 
     } else { 
      $scope.selection.push(title); 
     } 
    }; 

Если вы хотите выбрать все кнопки добавить остальные пункты, то это ваше решение:

$scope.getSelectedItem = function getSelectedItems(title) { 

    if (Array.isArray(title)) { 
     for (var i = 0; i < title.length; i++) { 
      var idx = $scope.selection.indexOf(title[i]); 
      // don't add if already in the array 
      if (idx == -1) { 
       $scope.selection.push(title[i]); 
      } 
     } 
    } else { 
     var idx = $scope.selection.indexOf(title); 
     // is currently selected 
     if (idx > -1) { 
      $scope.selection.splice(idx, 1); 
     } else { 
      $scope.selection.push(title); 
     } 
    } 

}; 
+0

ваше второе решение - то, что мне нужно! Отлично спасибо! –

0

Ваш код работы, но вам нужно создать еще

for(var i=0;i<title.length;i++) { 
var n_idx = $scope.selection.indexOf(title[i]); 
if(n_idx == -1){ 
    $scope.selection.push(title[i]); 
}else{ 
    $scope.selection.splice(n_idx, 1); 
} 
} 


var myApp = angular.module('myApp',[]); 

//myApp.directive('myDirective', function() {}); 
//myApp.factory('myService', function() {}); 

function MyCtrl($scope) { 
    $scope.all_titles = [ 
     "Title 1", 
     "Title 2", 
     "Title 3", 
     "Title 4" 
     ]; 

    $scope.selection=[]; 

    $scope.getSelectedItem = function getSelectedItems(title) { 
      var idx = $scope.selection.indexOf(title); 
      // is currently selected 
      if (idx > -1) { 
       $scope.selection.splice(idx, 1); 
      } 
      // is newly selected 
      else { 
       if(Array.isArray(title)) { 
        console.log("YES"); 
        for(var i=0;i<title.length;i++) { 
         var n_idx = $scope.selection.indexOf(title[i]); 
         if(n_idx == -1){ 
          $scope.selection.push(title[i]); 
         }else{ 
          $scope.selection.splice(n_idx, 1); 
         } 
        } 
       } else { 
        $scope.selection.push(title); 
       } 
      } 
     }; 
} 
0

Netzach имеет право касательно ошибки.

Также я бы оптимизировал ваш код, используя хеш вместо того, чтобы перебирать массив. Затем код исключения/включая стоимость будет выглядеть следующим образом:

if($scope.selection[title]){ 
     delete $scope.selection[title]; 
    } else { 
     $scope.selection[title] = true; 
    } 

Вот jsfiddle на рабочий пример:

http://jsfiddle.net/HB7LU/20348/

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