Solucionado (ver solução)
Solucionado
(ver solução)
12
respostas

Ordenar toda vez que for adicionada uma nova negociação

Por enquanto eu estou fazendo isso no método adiciona: this.ordena(this._ordemAtual)

A minha pergunta é: Há alguma forma mais elegante de ordenar de acordo com o último critério utilizado a view toda vez que é adicionada uma nova negociação?

12 respostas

Você precisar reordenar toda vez a lista sempre que adicionar um novo item. Sendo assim você chama o ordena toda vez que adicionar um novo item.

Mas tente ordenar no modelo e não no controller. No adiciona de ListaNegociacoes. Só que você precisará guardar o último critério utilizado passado para sort.

Pegou a idéia? Assim fica uma solução mais oo...porque onde vc leve ListaNegociacoes o adicionar que ordena irá junto.

Pegou a idéia?

Segue um exemplo prova de conceito da classe ListaNegociacoes alterada para manter sempre a ordem do último critério selecionado:

class ListaNegociacoes {

    constructor() {

        this._negociacoes = [];
        this._criterioOrdenacao;
    }

    adiciona(negociacao) {

        this._negociacoes.push(negociacao);
        if(this._criterioOrdenacao) this.ordena(this._criterioOrdenacao);
    }

    get negociacoes() {

        return [].concat(this._negociacoes);
    }

    esvazia() {

        this._negociacoes = [];
    }

    get volumeTotal() {
       return this._negociacoes.reduce((total, n) => total + n.volume, 0.0);
    }

    ordena(criterio) {
        this._criterioOrdenacao = criterio;
        this._negociacoes.sort(criterio);        
    }

    inverteOrdem() {

        this._negociacoes.reverse();
    }    
}

Veja que seu controller não precisa se preocupar, basta ela chamar adiciona de ListaNegociacoes

Thiago, só não deixa de me passar um feedback dessa dúvida. Eu fico monitorando aqui para saber quais já foram resolvidas.

Eu tinha feito um código semelhante, só não tive tempo de responder aqui. Só ainda não consigo a parte da ordem ser crescente ou decrescente. Já que a mudança só pode ocorrer se for chamada no controller. Quando o método adiciona for chamado ele tem que ordenar pela o último critério e dizer se é crescente ou não. Não consigo pensar numa solução para isso.

Só vc testar se o critério é igual ao anterior, se for, você faz um reverse. Esse desafio eu deixo com você :)

Aliás, só uma dica: o que você quer fazer é válido para efeito de desafio, mas não é bom para o usuário. Se vc ordena a lista automaticamente, o usuário não saberá se o item dele foi adicionado, porque aparecerá em uma posição não esperada e nunca como último item. Nesse caso, é o usuário que deve decidir se vai ordenar ou não depois de ter incluído novos itens.

Quando quiser jogar a toalha eu mostro uma solução. :)

solução!

Oi Thiago, para a gente finalizar, segue uma implementação prova de conceito para você se basear:

Primeiro, eu jogo toda a responsabilidade de ordenação em na classe ListaNegociacoes:

class ListaNegociacoes {

    constructor() {

        this._negociacoes = [];
        this._ordenadoPor = null;
        this._ascendente = true;

    }

    adiciona(negociacao) {

        this._negociacoes.push(negociacao);
        this.ordena(this._ordenadoPor, true);
    }

    get negociacoes() {

        return [].concat(this._negociacoes);
    }

    esvazia() {

        this._negociacoes = [];
    }

    get volumeTotal() {
       return this._negociacoes.reduce((total, n) => total + n.volume, 0.0);
    }

    ordena(coluna, manterOrientacaoAtual) {
        this._ordenadoPor = coluna;

        if(!manterOrientacaoAtual) this._ascendente = ! this._ascendente

        if(this._ascendente) {
            this._negociacoes.sort((a, b) => a[coluna] - b[coluna]);
        } else {
            this._negociacoes.sort((a, b) => b[coluna] - a[coluna]);
        }
    }    
}

Agora, no controller, eu só faço isso:

    ordena(coluna) {

        this._listaNegociacoes.ordena(coluna);  
    }

Mas lembre-se: isso pode não ser uma boa ideia pois confunde o usuário.

Valeu cara!!!

Não tive tempo de estudar ontem, então agradeço a ajuda!!

Desculpe por fazer spoiler da solução. :) Sucesso e bom estudo Thiago!