Não consigo traduzir este código de Angualr 1 para Angular 2:
ng-repeat="todo in todos | orderBy: 'completed'"
Isso é o que fiz seguindo a resposta de Thierry Templier:
Modelo de componente:
*ngFor="#todo of todos | sort"
Código do componente:
@Component({
selector: 'my-app',
templateUrl: "./app/todo-list.component.html",
providers: [TodoService],
pipes: [ TodosSortPipe ]
})
Código do tubo:
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;
}
}
Estou tentando classificar uma matriz de Todo
s, ordenada pela propriedade completed
. Primeiro todo.completed = false
e depois o todo.complete = true
.
Não entendo muito bem o transform
método e como passar os argumentos nesse método e no sort
método.
Qual é o args: string
argumento? O que são a
e de b
onde vêm?
angular
angular2-template
angular-pipe
Alexander Abakumov
fonte
fonte
Respostas:
Modifiquei a resposta de @Thierry Templier para que o cachimbo possa classificar objetos personalizados em angular 4:
E para usar:
Espero que isso ajude alguém.
fonte
The pipe 'sort' could not be found
. Posso de alguma forma injetar um tubo no meu componente como em 2 tubos angulares: [ArraySortPipe]?Consulte https://angular.io/guide/pipes#apencha-no-filterpipe-or-orderbypipe para a discussão completa. Esta citação é muito relevante. Basicamente, para aplicativos de grande escala que devem ser minimizados agressivamente, a lógica de filtragem e classificação deve ser movida para o próprio componente.
fonte
filteredHeroes
esortedHeroes
, acho que a ideia é que, ao inicializar o componente, você executaria alguma lógica de classificação / filtragem (talvez chamando um método de ngOnInit), em seguida, definindo essa propriedade com os resultados classificados / filtrados, e apenas execute novamente a lógica / atualize a propriedade se houver algo que acione uma necessidade (por exemplo, a interação do usuário aciona uma chamada AJAX para obter mais heróis ou o usuário clica em uma caixa de seleção para filtrar metade deles com base em alguns critérios, etc.)Você poderia implementar um canal personalizado para isso que aproveite o
sort
método de matrizes:E use então este tubo conforme descrito abaixo. Não se esqueça de especificar o seu tubo no
pipes
atributo do componente:É um exemplo simples para matrizes com valores de string, mas você pode ter algum processamento de classificação avançado (com base em atributos de objeto no caso de matriz de objeto, com base em parâmetros de classificação, ...).
Aqui está um plunkr para isso: https://plnkr.co/edit/WbzqDDOqN1oAhvqMkQRQ?p=preview .
Espero que ajude você, Thierry
fonte
sort
método é um método doArray
objeto JavaScript . Veja este link: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… .pipes: [..]
declaração não é mais válida (e não é mais necessária)OrderByPipe atualizado: corrigido, sem classificação de strings.
crie uma classe OrderByPipe:
em seu controlador:
ou em seu
em seu html:
fonte
Angular não vem com um filtro orderBy pronto para uso, mas se decidirmos que precisamos de um, podemos facilmente fazer um. No entanto, existem algumas advertências que precisamos estar cientes relacionadas à velocidade e à minimização. Ver abaixo.
Um tubo simples seria algo assim.
Esse tubo aceita uma função de classificação (
fn
) e fornece a ela um valor padrão que classificará uma matriz de primitivas de uma maneira sensata. Temos a opção de substituir esta função de classificação, se desejarmos.Ele não aceita um nome de atributo como string, porque os nomes de atributo estão sujeitos a minificação. Eles mudarão quando reduzirmos nosso código, mas os minificadores não são inteligentes o suficiente para também reduzir o valor na string do modelo.
Primitivas de classificação (números e strings)
Podemos usar isso para classificar uma matriz de números ou strings usando o comparador padrão:
Classificando uma série de objetos
Se quisermos classificar um array de objetos, podemos atribuir a ele uma função de comparador.
Advertências - tubos puros vs. tubos impuros
Angular 2 tem um conceito de tubos puros e impuros.
Um tubo puro otimiza a detecção de alterações usando a identidade do objeto. Isso significa que o pipe só será executado se o objeto de entrada mudar de identidade, por exemplo, se adicionarmos um novo item ao array. Não vai descer aos objetos. Isso significa que, se alterarmos um atributo aninhado:
this.cats[2].name = "Fluffy"
por exemplo, o canal não será executado novamente. Isso ajuda o Angular a ser rápido. Os tubos angulares são puros por padrão.Um tubo impuro, por outro lado, verificará os atributos do objeto. Isso potencialmente o torna muito mais lento. Como não pode garantir o que a função de pipe fará (talvez seja diferente com base na hora do dia, por exemplo), um pipe impuro será executado sempre que ocorrer um evento assíncrono. Isso tornará seu aplicativo consideravelmente mais lento se a matriz for grande.
O tubo acima é puro. Isso significa que ele só será executado quando os objetos na matriz forem imutáveis. Se você trocar um gato, deverá substituir todo o objeto gato por um novo.
Podemos mudar o que está acima para um cano impuro definindo o atributo puro:
Este tubo descerá até os objetos, mas será mais lento. Use com cuidado.
fonte
Eu criei um pipe OrderBy que faz exatamente o que você precisa. Ele suporta a capacidade de classificar em várias colunas de uma lista de objetos também.
Este tubo permite adicionar mais itens à matriz após renderizar a página e classificará a matriz com as atualizações dinamicamente.
Eu tenho um artigo sobre o processo aqui .
E aqui está uma demonstração operacional: http://fuelinteractive.github.io/fuel-ui/#/pipe/orderby e https://plnkr.co/edit/DHLVc0?p=info
fonte
Recomendo que você use lodash com angular, então seu cachimbo será o próximo:
e usá-lo em html como
e não se esqueça de adicionar Pipe ao seu módulo
fonte
Isso funcionará para qualquer campo que você passar para ele. ( IMPORTANTE: Só vai ordenar alfabeticamente, então se você passar uma data vai ordenar como alfabeto e não como data)
fonte
@Component
não tempipes
propriedade.Isso é bom substituto para AngularJS orderby tubulação em angular 4 . Fácil e simples de usar.
Este é o URL do github para obter mais informações https://github.com/VadimDez/ngx-order-pipe
fonte
Como sabemos que o filtro e a ordem são removidos do ANGULAR 2 e precisamos escrever o nosso próprio, aqui está um bom exemplo sobre plunker e artigo detalhado
Ele usou tanto o filtro quanto o orderby, aqui está o código para o pedido
fonte
Você pode usar isso para objetos:
fonte
Em package.json, adicione algo como (Esta versão é adequada para Angular 2):
Em seu módulo de texto digitado (e matriz de importações):
fonte
fonte
Na versão atual do Angular2, os canais orderBy e ArraySort não são compatíveis. Você precisa escrever / usar alguns canais personalizados para isso.
fonte
Para a versão Angular 5+ , podemos usar o pacote ngx-order-pipe
Link do tutorial da fonte
Pacote de instalação
Importar no módulo de aplicativos
use em qualquer lugar
fonte
orderby Pipe em Angular JS oferecerá suporte, mas Angular (versões superiores) não . Encontre os detalhes discutidos para aumentar a velocidade de desempenho de seu obsoleto.
https://angular.io/guide/pipes#apethoscope-no-filterpipe-or-orderbypipe
fonte
fonte