No puedo traducir este código de Angualr 1 a Angular 2:
ng-repeat="todo in todos | orderBy: 'completed'"
Esto es lo que hice siguiendo la respuesta de Thierry Templier:
Plantilla de componente:
*ngFor="#todo of todos | sort"
Código de componente:
@Component({
selector: 'my-app',
templateUrl: "./app/todo-list.component.html",
providers: [TodoService],
pipes: [ TodosSortPipe ]
})
Código de tubería:
import { Pipe } from "angular2/core";
import {Todo} from './todo';
@Pipe({
name: "sort"
})
export class TodosSortPipe {
transform(array: Array<Todo>, args: string): Array<Todo> {
array.sort((a: any, b: any) => {
if (a < b) {
return -1;
} else if (a > b) {
return 1;
} else {
return 0;
}
});
return array;
}
}
Estoy tratando de ordenar una matriz de Todo
s, ordenados por propiedad completed
. Primero todo.completed = false
y luego el todo.complete = true
.
No entiendo muy bien el transform
método y cómo pasar los argumentos en ese método y en el sort
método.
Cual es el args: string
argumento? ¿Qué son a
y de b
dónde vienen?
angular
angular2-template
angular-pipe
Alexander Abakumov
fuente
fuente
Respuestas:
Modifiqué la respuesta de @Thierry Templier para que la tubería pueda ordenar objetos personalizados en angular 4:
Y para usarlo:
Ojalá esto ayude a alguien.
fuente
The pipe 'sort' could not be found
. ¿Puedo de alguna manera inyectar tubería en mi componente como en 2 tuberías angulares: [ArraySortPipe]?Consulte https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe para ver la discusión completa. Esta cita es la más relevante. Básicamente, para aplicaciones a gran escala que deben minimizarse de manera agresiva, la lógica de filtrado y clasificación debe trasladarse al componente en sí.
fuente
filteredHeroes
ysortedHeroes
, creo que la idea es que al inicializar el componente ejecutarías alguna lógica de clasificación / filtrado (tal vez llamando a un método desde ngOnInit), luego estableciendo esa propiedad con los resultados ordenados / filtrados, y solo vuelva a ejecutar la lógica / actualice la propiedad si hay algo que desencadena una necesidad (por ejemplo, la interacción del usuario desencadena una llamada AJAX para obtener más héroes, o el usuario hace clic en una casilla de verificación para filtrar la mitad de ellos según algunos criterios, etc.)Puede implementar una tubería personalizada para esto que aproveche el
sort
método de matrices:Y luego use esta tubería como se describe a continuación. No olvide especificar su tubería en el
pipes
atributo del componente:Es una muestra simple para matrices con valores de cadena, pero puede tener algún procesamiento de clasificación avanzado (basado en atributos de objeto en el caso de matriz de objeto, basado en parámetros de clasificación, ...).
Aquí hay un plunkr para esto: https://plnkr.co/edit/WbzqDDOqN1oAhvqMkQRQ?p=preview .
Espero que te ayude, Thierry
fuente
sort
método es un método delArray
objeto JavaScript . Vea este enlace: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .pipes: [..]
declaración ya no es válida (y ya no es necesaria)OrderByPipe actualizado: se corrigieron las cadenas sin clasificar.
crear una clase OrderByPipe:
en tu controlador:
o en tu
en tu html:
fuente
Angular no viene con un filtro orderBy listo para usar, pero si decidimos que necesitamos uno, podemos crear uno fácilmente. Sin embargo, hay algunas advertencias que debemos tener en cuenta en relación con la velocidad y la minificación. Vea abajo.
Una pipa simple se vería así.
Esta tubería acepta una función de clasificación (
fn
) y le da un valor predeterminado que clasificará una matriz de primitivas de una manera sensata. Tenemos la opción de anular esta función de clasificación si lo deseamos.No acepta un nombre de atributo como una cadena, porque los nombres de atributo están sujetos a minificación. Cambiarán cuando minimicemos nuestro código, pero los minificadores no son lo suficientemente inteligentes como para minimizar también el valor en la cadena de la plantilla.
Ordenar primitivas (números y cadenas)
Podríamos usar esto para ordenar una matriz de números o cadenas usando el comparador predeterminado:
Ordenar una matriz de objetos
Si queremos ordenar una matriz de objetos, podemos darle una función de comparación.
Advertencias: pipas puras vs impuras
Angular 2 tiene un concepto de tuberías puras e impuras.
Una tubería pura optimiza la detección de cambios utilizando la identidad del objeto. Esto significa que la tubería solo se ejecutará si el objeto de entrada cambia de identidad, por ejemplo, si agregamos un nuevo elemento a la matriz. No descenderá a los objetos. Esto significa que si cambiamos un atributo anidado:
this.cats[2].name = "Fluffy"
por ejemplo, la tubería no se volverá a ejecutar. Esto ayuda a Angular a ser rápido. Las tuberías angulares son puras por defecto.Una tubería impura, por otro lado, verificará los atributos del objeto. Esto potencialmente lo hace mucho más lento. Debido a que no puede garantizar lo que hará la función de tubería (tal vez se clasificó de manera diferente según la hora del día, por ejemplo), una tubería impura se ejecutará cada vez que ocurra un evento asincrónico. Esto ralentizará considerablemente su aplicación si la matriz es grande.
La pipa de arriba es pura. Esto significa que solo se ejecutará cuando los objetos de la matriz sean inmutables. Si cambia un gato, debe reemplazar todo el objeto gato por uno nuevo.
Podemos cambiar lo anterior a una tubería impura estableciendo el atributo puro:
Esta tubería descenderá hacia los objetos, pero será más lenta. Úselo con precaución.
fuente
He creado una tubería OrderBy que hace exactamente lo que necesita. También admite la posibilidad de ordenar en varias columnas de un enumerable de objetos.
Esta tubería permite agregar más elementos a la matriz después de renderizar la página y ordenará la matriz con las actualizaciones de forma dinámica.
Tengo un escrito sobre el proceso aquí .
Y aquí hay una demostración funcional: http://fuelinteractive.github.io/fuel-ui/#/pipe/orderby y https://plnkr.co/edit/DHLVc0?p=info
fuente
Te recomiendo que uses lodash con angular, entonces tu tubería será la siguiente:
y usarlo en html como
y no olvides agregar Pipe a tu módulo
fuente
Esto funcionará para cualquier campo que le pase. ( IMPORTANTE: Solo se ordenará alfabéticamente, por lo que si pasa una fecha, la ordenará como alfabeto, no como fecha)
fuente
@Component
no tienepipes
propiedad.Este es un buen reemplazo para AngularJs orderby pipe in angular 4 . Fácil y sencillo de usar.
Esta es la URL de github para obtener más información https://github.com/VadimDez/ngx-order-pipe
fuente
Como sabemos que el filtro y el orden se eliminan de ANGULAR 2 y necesitamos escribir el nuestro, aquí hay un buen ejemplo sobre plunker y un artículo detallado
Usó tanto el filtro como el orderby, aquí está el código para la tubería de pedido
fuente
Puede usar esto para objetos:
fuente
En package.json, agregue algo como (Esta versión está bien para Angular 2):
En su módulo mecanografiado (y matriz de importaciones):
fuente
fuente
En la versión actual de Angular2, no se admiten las tuberías orderBy y ArraySort. Necesita escribir / usar algunas tuberías personalizadas para esto.
fuente
Para la versión Angular 5+ podemos usar el paquete ngx-order-pipe
Enlace del tutorial de origen
Paquete de instalación
Importar en el módulo de aplicaciones
usar en cualquier lugar
fuente
orderby Pipe en Angular JS será compatible, pero Angular (versiones superiores) no será compatible . Por favor, encuentre que los detalles discutidos para aumentar la velocidad del rendimiento son obsoletos.
https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe
fuente
fuente