AngularJS – como obter uma referência de resultado filtrada ngRepeat

Eu estou usando uma diretiva ng-repeat com filtro assim:

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

e eu posso ver os resultados renderizados bem; Agora 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 um auto complete, tenho essa input:

  

e depois os resultados filtrados:

 
  • {{item.name}}

Agora quero navegar pelo resultado e selecionar um dos itens.

ATUALIZAÇÃO : Aqui está uma maneira mais fácil do que antes.

   
{{item}}

Então $scope.filteredItems está acessível.

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 possuem um contexto e this será vinculado ao escopo global. Você pode passar o contexto como um argumento ou usar a nova syntax de aliasing em 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); }; }); 

Então na sua opinião

   
{{item}}
{{item}}
{{item}}

Que lhe dá access a $scope.filteredItems .

Tente algo assim, o problema com o ng-repeat é que ele cria escopo filho por causa disso você não pode acessar

filteritems

do controlador

 
  • Atualizar:

    Mesmo depois do 1.3.0. se você quiser colocá-lo no escopo do controlador ou do pai, você não pode fazer isso com a syntax. Por exemplo, se eu tiver o seguinte código:

     
    {{labelResults}}
  • o acima não funcionará. A maneira de contornar isso é usando o $ pai assim:

     
  • Eu cheguei com uma versão um pouco melhor da solução de Andy. Em sua solução, a repetição-nova coloca uma observação na expressão que contém a atribuição. Cada loop digest avaliará essa expressão e atribuirá o resultado à variável de escopo.

    O problema com essa solução é que você pode se deparar com problemas de atribuição se estiver em um escopo filho. Esta é a mesma razão pela qual você deve ter um ponto no ng-model .

    A outra coisa que eu não gosto sobre esta solução é que ela enterra a definição da matriz filtrada em algum lugar na marcação da visão. Se for usado em vários lugares na sua visualização ou no seu controlador, isso pode ser confuso.

    Uma solução mais simples é apenas colocar um relógio no seu controlador em uma function que faz a atribuição:

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

    Essa function será avaliada durante cada ciclo digestivo, portanto, o desempenho deve ser comparável à solução de Andy. Você também pode adicionar qualquer número de atribuições na function para mantê-las todas em um único lugar, em vez de espalhadas pela exibição.

    Na exibição, você usaria apenas a lista filtrada diretamente:

     
    • {{item.name}}

    Aqui está um violino onde isso é mostrado em um cenário mais complicado.

    Confira esta resposta:

    Selecionando e acessando itens em ng-repeat