Я использую директиву ng-repeat с таким фильтром:
ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4"
и я прекрасно вижу визуализированные результаты; Теперь я хочу запустить логику этого результата в моем контроллере. Вопрос в том, как я могу получить ссылку на элементы результатов?
Обновить:
Чтобы уточнить: я пытаюсь создать автозаполнение, у меня есть следующие данные:
<input id="queryInput" ng-model="query" type="text" size="30" placeholder="Enter query">
а затем отфильтрованные результаты:
<ul>
<li ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4">{{item.name}}</li>
</ul>
теперь я хочу перейти к результату и выбрать один из элементов.
javascript
angularjs
filter
angularjs-ng-repeat
Шломи Шварц
источник
источник
filteredItems
я всегда получаю данные одним фильтром позже. Это не результат только что измененного фильтра, а результат предыдущего изменения. Любые идеи?Вот версия с фильтром решения Энди Джослина.
Обновление: ПРЕРЫВАНИЕ ИЗМЕНЕНИЙ. Начиная с версии 1.3.0-beta.19 ( эта фиксация ) фильтры не имеют контекста и
this
будут привязаны к глобальной области. Вы можете передать контекст в качестве аргумента или использовать новый синтаксис псевдонимов в ngRepeat , 1.3.0-beta.17 +.Тогда на ваш взгляд
Что дает вам доступ к
$scope.filteredItems
.источник
$parse
это компилятор выражений Angular . Например, он примет строку 'some.object.property' и вернет функцию, которая позволяет вам либо установить, либо получить значение по указанному пути для указанного контекст. Я использую его для настройки результатов фильтрации здесь, в частности, в $ scope. Надеюсь, это ответит на ваш вопрос.Попробуйте что-то вроде этого, проблема с ng-repeat в том, что он создает дочернюю область, из-за которой вы не можете получить доступ
от контроллера
источник
Обновить:
Даже после 1.3.0. если вы хотите , чтобы поставить его на сферу действия контроллера или родитель , вы не можете сделать это с помощью, как синтаксис. Например, если у меня есть следующий код:
вышеуказанное не сработает. Чтобы обойти это, используйте $ parent так:
источник
console.log labelResults
всегда получаю данные одним фильтром позже. Это не результат только что измененного фильтра, а результат предыдущего изменения. У вас не было этой проблемы?Я придумал несколько лучшую версию решения Энди. В своем решении ng-repeat устанавливает наблюдение за выражением, содержащим присвоение. Каждый цикл дайджеста будет оценивать это выражение и присваивать результат переменной области видимости.
Проблема с этим решением заключается в том, что вы можете столкнуться с проблемами назначения, если находитесь в дочерней области. По этой же причине у вас должна быть точка в ng-модели .
Еще одна вещь, которая мне не нравится в этом решении, заключается в том, что оно скрывает определение фильтрованного массива где-то в разметке представления. Если он используется в нескольких местах вашего представления или вашего контроллера, это может сбить с толку.
Более простое решение - просто поместить часы в контроллер на функцию, которая выполняет назначение:
Эта функция будет оцениваться во время каждого цикла дайджеста, поэтому производительность должна быть сопоставима с решением Энди. Вы также можете добавить любое количество назначений в функцию, чтобы все они находились в одном месте, а не разбросаны по представлению.
В представлении вы просто использовали бы отфильтрованный список напрямую:
Вот скрипка, где это показано в более сложном сценарии.
источник
Отметьте этот ответ:
Выбор и доступ к элементам в ng-repeat
источник