6

Próbuję zrobić jedno demo, w którym mam jedną listę pole wyboru. Jestem w stanie wyświetlić listę za pomocą ng-repeat.dlaczego splice nie działają poprawnie w kątowym js

To, czego potrzebuję, jeśli użytkownik kliknie jedno pole wyboru (zaznaczone jest tylko jedno pole wyboru). Wyświetla tylko jedną kolumnę (100%) szerokości. Który użytkownik zaznaczył dwie kolumny, wyświetla dwie kolumny o równej szerokości (50%). jeśli check użytkownik trzy kolumny to pokazują trzy kolumny równych ..As szerokości tak, jakby użytkownik zaznaczone pole wyboru cztery to pokazać cztery kolumny o równej szerokości ..Initially niektóre z wyboru jest zaznaczone (sprawdzić: prawda) ..

  • moim pierwszym krokiem jest odznaczenie sprawdzonej opcji "szkolenie 3" .., ale po odznaczeniu nadal wyświetla dlaczego? Już używam splice. metoda ?

tutaj jest mój kod http://codepen.io/anon/pen/adBroe?editors=101

init(); 
    function init(){ 
     for(var i =0;i<self.data.length;i++){ 
     var obj=self.data[i]; 
     if(obj.checked) 
     { 
     self.selectedList.push(obj); 
     } 
    } 
    alert('starting '+self.selectedList.length) 
    } 

    self.checkBoxClick=function(obj,i){ 
    if(obj.checked) 
     { 
     alert('if') 
     self.selectedList.push(obj); 
     }else 
     { 
      alert('else'+i); 
      self.selectedList.splice(i,1); 
     } 
    alert(self.selectedList.length); 

    } 

}) 

tutaj jest próbuję wyświetlić

<div class='container-fluid'> 
    <div class='row'> 
     <div ng-repeat="i in vm.selectedList" class='col-xs-{{12/vm.selectedList.length}}'> 
     {{i.name}} 
     </div> 
    </div> 
    </div> 
+0

qctually Pytanie jest podobny, ale istnieje pewien problem, że nie działa, jeśli splice Sprawdziłem początkowo pewne pole – user944513

+0

usunę ten post ..ale Widziałem wytyczną, że tylko zadać jedno pytanie na każde pytanie – user944513

+0

To OK, aby zadać kolejne pytanie dotyczące Twojego kodu, jeśli nadal masz problemy. Jeśli jednak masz zamiar to zrobić, najlepiej upewnić się, że nowe pytanie nie wydaje się być kopią pierwszego pytania. A dla zapisu, '.splice()' działa idealnie dobrze, jest to dobrze przetestowany kawałek kodu. – Claies

Odpowiedz

4

To może być znacznie prostsze. W HTML nie trzeba nawet ngChange obsługi, tylko wiążą się sprawdzonej własności:

<div class="checkbox" ng-repeat='v in vm.data'> 
    <label> 
     <input type="checkbox" ng-model='v.checked'> {{v.name}} 
    </label> 
    </div> 

a następnie uczynić z kolumny tylko ngRepeat:

<div ng-repeat="i in filteredList = (vm.data | filter:{checked:true})" class='col-xs-{{12/filteredList.length}}'> 
    {{i.name}} 
    </div> 

tak rezultacie czystą kontrolera bez logiki w wszystko, z Angular robi wszystkie niezbędne filtrowanie kolumn przy użyciu szablonu vm.data | filter:{checked:true}.

Demo:http://codepen.io/anon/pen/bEBydL?editors=101

+0

czy mógłbyś wyjaśnić to ng-repeat =" i w filtersList = (vm.data | filter: {sprawdzone: true}) " – user944513

+0

vm.data jest przypisywany do listy filtersList (ten sam odnośnik)? i jak działa filtr ... sprawdź wszystko w vm.data.innymi słowy {checked: true} chaeck we wszystkich obiektach w vm.data – user944513

+0

Z wyrażeniem 'filteredList = (vm.data | filter: {sprawdzane: true})" 'tworzysz nową" zmienną "' filterList', dzięki czemu może ponownie użyć go w '{{12/filteredList.length}}' bez konieczności pisania '{{//vm.data | filter: {sprawdzane: true}). length}}' co jest mniej wydajne i trudniejsze do odczytania – dfsq

2

Dzieje się tak dlatego, że starają się usunąć go z 2 indeksu podczas treningu 3 jest obecny w indeksie 0th.

else 
    { 
     alert('unchecked '+i); 
     var index = self.selectedList.indexOf(obj); 
     self.selectedList.splice(index,1); 

    } 

zmień swoją drugą część na tę. i będzie działać dobrze.

http://codepen.io/anon/pen/yeVWeQ?editors=101

Powiązane problemy