2013-06-14 16 views
5

Potrzebuję zmienić zmienną $scope w filtrze. Zmienna $scope jest używana dla atrybutu ng-show, a informacja jest dostępna tylko w filtrze, ponieważ mam ng-repeat z pewnymi informacjami i zastosowany przez niektóre filtry i muszę wiedzieć, kiedy filtry usuwają cały mój wynik, aby wyświetlić komunikat ... oto przykład: (jest to tylko pomysł)

.controller("thing", function() { 
    $scope.showText = false; 
}) 

.filter("filterText", function() { 
    return function(information) { 
    if (information == "") { /* NEED TO CHANGE $scope.showText to true */ } 
    } 
}) 

HTML:

<div ng-view="showText"> Some Text here </div> 
<div ng-repeat="info in information | filterText"></div> 

Dzięki.

+9

Czy uważasz, że filtr powinien uzyskać dostęp do kontrolera i zmienić informacje? Dlaczego miałby to robić? Czy działanie kontrolera nie uruchamia się, jeśli zmienna showText powinna się zmienić? –

+0

Kierujesz się w złym kierunku. Zgadzam się z @PetarMinchev, filtry nie powinny dotyczyć lub mieć dostęp do kontrolerów lub zakresów. Z definicji filtry dotyczą tylko danych wejściowych przekazywanych w może zostać zmniejszona i nic więcej. Z ograniczonymi informacjami dotyczącymi tego, co próbujesz osiągnąć, z perspektywy wysokiego poziomu powinieneś używać jednokierunkowego wiązania do monitorowania, jeśli 'informacja | filterText' ma długość zero. – tamakisquare

+1

filtry nigdy nie powinny zmieniać danych, które są podawane, ponieważ może to spowodować wiele cykli '$ digest' i spowolnić działanie. Umieść wszystko, czego potrzebujesz w kontrolerze. – g00fy

Odpowiedz

4

Zgadzam się z komentarzami, które prawdopodobnie nie mają na celu zmiany danych w filtrze, ale jeśli naprawdę ciężko byłoby ci je wytłumaczyć, wystarczy zdefiniować funkcję filtra wewnątrz kontrolera (a nie rzeczywisty kątowy "filtr"), a następnie po prostu użyj go jako takiego:

ng-repeat="item in items | filter:myFilter()" 

$scope.myFilter = function(item) { 
    // access to scope here 
}