AngularJS-jak uzyskać ngRepeat filtered result reference

Używam dyrektywy ng-repeat z filtrem w ten sposób:

ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4"

I widzę renderowane wyniki w porządku; teraz chcę uruchomić logikę na tym wyniku w moim kontrolerze. Pytanie brzmi, Jak mogę pobrać odniesienie do pozycji wyników?

Update:


Dla jasności: próbuję stworzyć auto complete, mam takie wejście:

<input id="queryInput" ng-model="query" type="text" size="30" placeholder="Enter query">

A następnie przefiltrowane wyniki:

<ul>
   <li  ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4">{{item.name}}</li>
</ul>

Teraz chcę nawigować po wynikach i wybrać jeden z pozycji.

Author: Damjan Pavlica, 2012-07-30

6 answers

UPDATE: Oto łatwiejszy sposób niż wcześniej.

 <input ng-model="query">
 <div ng-repeat="item in (filteredItems = (items | orderBy:'order_prop' | filter:query | limitTo:4))">
   {{item}}
 </div>

Wtedy $scope.filteredItems jest dostępne.

 257
Author: Andrew Joslin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-27 15:23:07

Oto filtrująca wersja rozwiązania Andy ' ego Joslina.

Update: BREAKING CHANGE. Od wersji 1.3.0-beta.19 (Ten commit ) filtry nie mają kontekstu i this będą powiązane z globalnym zakresem. Możesz przekazać kontekst jako argument lub użyć nowej składni aliasingu w ngRepeat , 1.3.0-beta.17+.

// pre 1.3.0-beta.19
yourModule.filter("as", function($parse) {
  return function(value, path) {
    return $parse(path).assign(this, value);
  };
});

// 1.3.0-beta.19+
yourModule.filter("as", function($parse) {
  return function(value, context, path) {
    return $parse(path).assign(context, value);
  };
});

Then in your view

<!-- pre 1.3.0-beta.19 -->
<input ng-model="query">
<div ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4 | as:'filteredItems'">
 {{item}}
</div>

<!-- 1.3.0-beta.19+ -->
<input ng-model="query">
<div ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4 | as:this:'filteredItems'">
 {{item}}
</div>

<!-- 1.3.0-beta.17+ ngRepeat aliasing -->
<input ng-model="query">
<div ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4 as filteredItems">
 {{item}}
</div>

, który daje dostęp do $scope.filteredItems.

 30
Author: kevinjamesus86,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-15 16:37:34

Spróbuj czegoś takiego, problem z ng-repeat polega na tym, że tworzy zakres potomny, ponieważ nie możesz uzyskać dostępu

Filteritems

Z kontrolera

<li ng-repeat="doc in $parent.filteritems = (docs | filter:searchitems)" ></li>
 21
Author: imal hasaranga perera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-24 16:02:33

Update:

Nawet po 1.3.0. jeśli chcesz umieścić go w zakresie kontrolera lub rodzica, nie możesz tego zrobić za pomocą składni jako. Na przykład, jeśli mam następujący kod:

<div>{{labelResults}}</div>
<li ng-repeat="label in (labels | filter:query | as labelResults)">
</div>

Powyższe będzie NIE działać. Aby go obejść, należy użyć $ parent Jako Tak:

<li ng-repeat="label in ($parent.labelResults = (labels | filter:query))">
 14
Author: Gal Bracha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-07 15:06:39

Wymyśliłem nieco lepszą wersję rozwiązania Andy ' ego. W swoim rozwiązaniu ng-repeat umieszcza zegarek na wyrażeniu zawierającym przypisanie. Każda pętla digest oceni to wyrażenie i przypisze wynik do zmiennej scope.

Problem z tym rozwiązaniem polega na tym, że możesz napotkać problemy z przypisaniem, jeśli jesteś w zakresie podrzędnym. Z tego samego powodu powinieneś mieć kropkę w modelu ng .

Druga rzecz, której nie lubię w tym rozwiązaniu jest to, że ukrywa definicję filtrowanej tablicy gdzieś w znacznikach widoku. Jeśli jest używany w wielu miejscach w widoku lub kontrolerze, może być mylący.

Prostszym rozwiązaniem jest po prostu umieszczenie zegarka w kontrolerze na funkcji, która sprawia, że przypisanie:

$scope.$watch(function () {
    $scope.filteredItems = $scope.$eval("items | orderBy:'order_prop' | filter:query | limitTo:4");
});

Ta funkcja będzie oceniana podczas każdego cyklu fermentacji, więc wydajność powinna być porównywalna z rozwiązaniem Andy ' ego. Możesz również dodać dowolną liczbę zadań w funkcji, aby zachować je wszystkie w jedno miejsce, a nie rozrzucone wokół widoku.

W widoku wystarczy użyć filtrowanej listy bezpośrednio:

<ul>
    <li  ng-repeat="item in filteredItems">{{item.name}}</li>
</ul>

Oto skrzypce, gdzie jest to pokazane w bardziej skomplikowanym scenariuszu.

 10
Author: Dave Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:36

Sprawdź tę odpowiedź:

Wybór i dostęp do elementów w ng-repeat

<li ng-repeat="item in ..." ng-click="select_item(item)">
 -2
Author: Simon De Uvarow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:36