Estou usando uma diretiva ng-repeat com filtro da seguinte forma:
ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4"
e eu posso ver os resultados renderizados bem; agora eu quero executar alguma lógica nesse resultado no meu controlador. A questão é como posso pegar a referência de itens de resultado?
Atualizar:
Só para esclarecer: estou tentando criar uma conclusão automática, tenho esta entrada:
<input id="queryInput" ng-model="query" type="text" size="30" placeholder="Enter query">
e depois os resultados filtrados:
<ul>
<li ng-repeat="item in items | orderBy:'order_prop' | filter:query | limitTo:4">{{item.name}}</li>
</ul>
agora eu quero navegar no resultado e selecionar um dos itens.
javascript
angularjs
filter
angularjs-ng-repeat
Shlomi Schwartz
fonte
fonte
filteredItems
, sempre recebo os dados um filtro mais tarde. Não é o resultado do filtro recém-alterado, mas o da alteração anterior. Alguma ideia?Aqui está a versão do filtro da solução de Andy Joslin.
Atualização: BREAKING CHANGE. A partir da versão 1.3.0-beta.19 ( este commit ), os filtros não têm um contexto e
this
estarão vinculados ao escopo global. Você pode passar o contexto como argumento ou usar a nova sintaxe de alias no ngRepeat , 1.3.0-beta.17 +.Então, na sua opinião
O que lhe dá acesso
$scope.filteredItems
.fonte
$parse
é o compilador de expressão do Angular . Por exemplo, ele pega a string 'some.object.property' e retorna uma função que permite definir ou obter um valor no referido caminho para um especificado contexto. Estou usando-o para definir os resultados do filtro no escopo $ aqui, especificamente. Espero que isso responda à sua pergunta.Tente algo como isto, o problema com o ng-repeat é que ele cria escopo filho por causa disso você não pode acessar
do controlador
fonte
Atualizar:
Mesmo depois da 1.3.0. se você quiser colocá-lo no escopo do controlador ou do pai, não poderá fazê-lo como sintaxe. Por exemplo, se eu tiver o seguinte código:
o acima não irá funcionar. A maneira de contornar isso é usar o $ parent da seguinte maneira:
fonte
console.log labelResults
sempre obtiver os dados um filtro mais tarde. Não é o resultado do filtro recém-alterado, mas o da alteração anterior. Você não teve esse problema?Eu vim com uma versão um pouco melhor da solução de Andy. Em sua solução, ng-repeat coloca um relógio na expressão que contém a atribuição. Cada loop de resumo avaliará essa expressão e atribuirá o resultado à variável de escopo.
O problema com esta solução é que você pode ter problemas de atribuição se estiver no escopo filho. Esta é a mesma razão pela qual você deve ter um ponto no modelo ng .
A outra coisa que eu não gosto nessa solução é que ela enterra a definição da matriz filtrada em algum lugar da marcação de exibição. Se for usado em vários lugares na sua visualização ou no seu controlador, pode ficar confuso.
Uma solução mais simples é colocar um relógio no seu controlador em uma função que faz a atribuição:
Esta função será avaliada durante cada ciclo de digestão, para que o desempenho seja comparável à solução de Andy. Você também pode adicionar qualquer número de atribuições à função para mantê-las todas em um só lugar, em vez de espalhadas pela exibição.
Na visualização, você usaria a lista filtrada diretamente:
Aqui está um violino, onde isso é mostrado em um cenário mais complicado.
fonte
Verifique esta resposta:
Selecionando e acessando itens em ng-repeat
fonte