AngularJS - marcador de posición para resultado vacío del filtro

95

Quiero tener un marcador de posición, por ejemplo, <No result>cuando el resultado del filtro devuelve vacío. ¿Alguien podría ayudarme? Ni siquiera sé por dónde empezar ...

HTML :

<div ng-controller="Ctrl">
<h1>My Foo</h1>
<ul>
    <li ng-repeat="foo in foos">
        <a href="#" ng-click="setBarFilter(foo.name)">{{foo.name}}</a>
    </li>
</ul>
<br />
<h1>My Bar</h1>
<ul>
    <li ng-repeat="bar in bars | filter:barFilter">{{bar.name}}</li>
</ul>

</div>

JS :

function Ctrl($scope) {

  $scope.foos = [{
    name: 'Foo 1'
  },{
    name: 'Foo 2'
  },{
    name: 'Foo 3'
  }];

  $scope.bars = [{
    name: 'Bar 1',
    foo: 'Foo 1'
  },{
    name: 'Bar 2',
    foo: 'Foo 2'
  }];

  $scope.setBarFilter = function(foo_name) {
    $scope.barFilter = {};
    $scope.barFilter.foo = foo_name;
  }
}

jsFiddle : http://jsfiddle.net/adrn/PEumV/1/

¡Gracias!

Adrian Gunawan
fuente
ah sí buen truco con ng-show. Muchas gracias
Adrian Gunawan

Respuestas:

252

Un ajuste en el enfoque que solo requiere que especifique el filtro una vez:

  <li ng-repeat="bar in filteredBars = (bars | filter:barFilter)">{{bar.name}}</li>
</ul>
<p ng-hide="filteredBars.length">Nothing here!</p>

Violín

Mark Rajcok
fuente
6
Esta es la mejor solución, ya que solo necesita declarar su filtro una vez. +1
Tim B James
1
El problema es que el mensaje "¡Nada aquí!" parte se muestra y se oculta muy rápidamente. Cuando obtiene datos con una solicitud ajax, hay un retraso antes de que se muestren los datos devueltos y, en ese momento, puede ver el mensaje "¡Nada aquí!" parte aparece y desaparece.
Temega
@Temega - podría agregar una clase "ng-hide" al div
Brian Oliver
3
@Temega Podrías usar ng-show = "
filterBars.length
Utilizo ng-controller = "FooController como $ ctrl" e hice "barra en $ ctrl.filteredBars = (bars | filter: barFilter)" para poder usar incluso $ ctrl.filteredBars.length fuera de ng-repeat. ¡Gracias por esta pista épica!
xlttj
37

Aquí está el truco con ng-show

HTML:

<div ng-controller="Ctrl">
<h1>My Foo</h1>
<ul>
    <li ng-repeat="foo in foos">
        <a href="#" ng-click="setBarFilter(foo.name)">{{foo.name}}</a>
    </li>
</ul>
<br />
<h1>My Bar</h1>
<ul>
    <li ng-repeat="bar in bars | filter:barFilter">{{bar.name}}</li>
</ul>
<p ng-show="(bars | filter:barFilter).length == 0">Nothing here!</p>

</div>

jsFiddle: http://jsfiddle.net/adrn/PEumV/2/

Adrian Gunawan
fuente
2
Pero en este caso, el filtro se ejecuta dos veces, ¿hay alguna forma de evitarlo?
Isaías
Gracias por esta solucion. He estado usando el filtro groupBy proporcionado aquí github.com/a8m/angular-filter pero desafortunadamente la respuesta aceptada anterior no funciona. Este método puede ejecutar el filtro dos veces, pero resolvió el problema independientemente.
Anthony
En mi caso funciona sin el "== 0". <p ng-show = "(bars | filter: barFilter) .length"> ¡Nada aquí! </p>
Alessio
22

Tomado de este documento oficial, así es como lo hacen:

ng-repeat="friend in friends | filter:q as results"

Luego usa los resultados como una matriz

<li class="animate-repeat" ng-if="results.length == 0">
  <strong>No results found...</strong>
</li>

Fragmento completo:

<div ng-controller="repeatController">
I have {{friends.length}} friends. They are:
<input type="search" ng-model="q" placeholder="filter friends..." aria-label="filter friends" />


<ul class="example-animate-container">
    <li class="animate-repeat" ng-repeat="friend in friends | filter:q as results">
      [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.
    </li>
    <li class="animate-repeat" ng-if="results.length == 0">
      <strong>No results found...</strong>
    </li>
  </ul>
</div>
caiocpricci2
fuente
4
Sospecho que las cosas cambiaron desde que se hizo esta pregunta por primera vez, pero dado que actualmente así es exactamente como los documentos de Angular sugieren que resuelva el problema, diría que este es el camino correcto a seguir en este punto.
jackel414
1
No pude encontrar otro ejemplo. Esto está "oculto", en su documentación de animación y fue por casualidad que lo noté el mismo día que lo necesitaba o no creo que lo hubiera recordado.
caiocpricci2