2015-04-29 12 views
6

Próbuję wyświetlić niektóre dane za pomocą ng-repeat. Chcę mieć filtr wyświetlanych danych i kiedy kliknę konkretny element, filtr powinien zostać usunięty. Po ponownym kliknięciu tego konkretnego elementu filtr powinien zostać dodany ponownie.Filtr przełączania kątowego w powtórzeniu ng

zacząłem z pomysłem, moim zdaniem mam:

<ion-item class="row" ng-repeat="t in tickets"> 
    <div class="col" ng-click="toggleFilter(t.name)">{{t.name}}</div> 
</ion-item> 

W moim kontrolera:

.controller('TicketCtrl', function ($scope, $filter) { 
    $scope.toggleFilter = function (name) { 
     name = $filter('getSlice')(name); 
     alert(name); 
    } 
}); 

Kiedy zaalarmowania name Daje poprawną przefiltrowaną element, ale to nie aktualizuje w widoku. Myślę, że to musi zrobić coś z zasięgiem dziecka z ng-repeat, ale nie wiem jak to zrobić z przełączaniem filtra.

Czy ktoś ma jakieś sugestie lub rozwiązanie, aby rozwiązać ten problem?

+1

można wyjaśnić w jaki sposób dodatkowo filtr ma działać? Obecnie twoja funkcja 'toggleFilter' nie robi niczego użytecznego poza ponownym przypisaniem wartości zmiennej' name', która jest przekazywana jako parametr. – djskinner

+0

@djskinner mój filtr po prostu pobiera dane wejściowe i wycina to wejście, aby uzyskać wynik maksymalnie 20 znaków i dodaje "..." do końca. Filtr działa, gdy ostrzegam o 'name'. – user3050534

Odpowiedz

0

To nie jest aktualizowanie w widoku, ponieważ w $ scope.toggleFilter modyfikujesz zmienną lokalną niezwiązaną z widokiem, w tej liście kątowa jest powiązana z twoją zmienną $ scope.tickets, więc powinieneś zmodyfikować bezpośrednio zmienną aby zobaczyć zmiany w widoku, można achive to za pomocą zmiennej iteracyjnej $ indeks dostępny podczas korzystania ngRepeat https://docs.angularjs.org/api/ng/directive/ngRepeat

wynikiem powinno być coś takiego:

-widok:

<ion-item class="row" ng-repeat="t in tickets"> 
    <div class="col" ng-click="toggleFilter(t.name, $index)">{{t.name}}</div> 
</ion-item> 

-controller:

.controller('TicketCtrl', function ($scope, $filter) { 
    $scope.toggleFilter = function (name, index) { 
     $scope.tickets[index].name = $filter('getSlice')(name); 
     alert(name); 
    } 

PS Off topic: Widzę, że używasz jonową ramy, jeśli masz zamiar używać NG-repeat w urządzeniach mobilnych wydajność ma być znacznie lepiej, gdyby użyć kolekcji powtarzanie dyrektywy, urządzenia przenośne nie działają płynnie podczas przewijania długich list elementów z ng-repeat, ponieważ de 2 way binding of angle. http://ionicframework.com/docs/api/directive/collectionRepeat/

+0

Dzięki za odpowiedź! Z użyciem 'indeksu' mogłem sprawić, żeby działało.Aby przełączyć, zapisałem oryginalne dane w tablicy, a także mam tablicę do sprawdzenia, czy określony element powinien mieć wartość true lub false. Aha i musiałem dodać 'track by $ index' do' ng-repeat'. Edycja: Dziękuję również za podpowiedź na temat kolekcji-powtórzyć. Ale w rzeczywistości nie używam dużych ilości pozycji na moich listach, chyba 10 pozycji na liście. Czy to nadal jest korzystne? – user3050534

+0

Cieszę się, że pomógł, w starszych urządzeniach zauważysz, że przewijanie jest nieco płynniejsze. Ale w nowszych urządzeniach zdecydowanie nie zauważysz różnicy. –

0

Keep it simple i stworzyć opakowanie:

HTML:

<div ng-app="app"> 
    <div ng-controller="ctrl"> 
     <button ng-click="toggleFilter()">Toggle Filter</button><br/> 
     <span ng-repeat="item in data | filter:myFilter"> 
      {{item}}<br/> 
     </span> 
    </div> 
</div> 

JS:

angular.module('app',[]). 
controller('ctrl', function($scope){ 
    $scope.data = [1,2,3,4,5,6,7,8,9,10]; 
    $scope.shouldRunFilter = false; 

    $scope.myFilter = function(item){ 
     if($scope.shouldRunFilter) 
     { 
      return item > 5; 
     } 

     return item; 
    } 

    $scope.toggleFilter = function(){ 
     $scope.shouldRunFilter = !$scope.shouldRunFilter; 
    } 
}); 

JSFIDDLE.

+0

Nie wiem, ale teraz filtr zostanie zastosowany do ** wszystkich ** pozycji w ramach 'ng-repeat'. Chcę tego tylko dla konkretnych przedmiotów. Pracuję nad rozwiązaniem teraz, korzystając z pomysłu Javiera Abrego. W każdym razie użyłem twojego sprawdzenia 'shouldRunFilter', więc dziękuję za to! – user3050534

2

Użytkownik chciałby śledzić stan wiersza (kliknięty lub nie kliknięty). Idealnie nie chcesz zmieniać nazwy właściwości zakresu.

Poniższy kod powinien pracować dla Ciebie

<ion-item class="row" ng-repeat="t in tickets" ng-click="t.clicked=!t.clicked"> 
    <div class="col" ng-if="t.clicked">{{t.name | getSlice}}</div> 
    <div class="col" ng-if="!t.clicked">{{t.name}}</div> 
</ion-item> 
+0

Tak, jest to dobre rozwiązanie i było również moim początkowym rozwiązaniem. Jedynym problemem, jaki miałem z tym, było to, że na niektórych starszych urządzeniach widziałeś oba elementy div przez milisekundę w tym samym czasie, to właśnie chciałem zapobiec. W każdym razie dzięki! – user3050534

Powiązane problemy