Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro na NegociaçãoController Método adiciona

Olá

Após a implementação do domInject.ts, meu código começo a dar o seguinte erro, e deixou de adicionar na listagem:

Buscando elemento #data do DOM para injetar em _inputData! 
NegociacaoController.js:33 Uncaught TypeError: Cannot read property 'toString' of undefined
    at NegociacaoController.adiciona (NegociacaoController.js:33)
    at HTMLFormElement.dispatch (jquery.min.js:3)
    at HTMLFormElement.q.handle (jquery.min.js:3)

NegociacaoController.ts

import { logarTempoDeExecucao } from '../helpers/decorators/logarTempoDeExecucao'
import { NegociacoesView, MensagemView } from '../views/index';
//import { MensagemView } from '../views/MensagemView';
import { Negociacoes, Negociacao  } from '../models/index';
//import { Negociacao } from '../models/Negociacao';
import { domInject } from '../helpers/decorators/index';

export class NegociacaoController {

   //private _inputData: HTMLInputElement;
   @domInject('#data') 
   private _inputData: JQuery;

   //private _inputQuantidade: HTMLInputElement;
   @domInject('#quantidade') 
   private _inputQuantidade: JQuery;

   //private _inputValor: HTMLInputElement;
   @domInject('#valor') 
   private _inputValor: JQuery;

   private _negociacoes: Negociacoes = new Negociacoes;
   private _negociacoesView = new NegociacoesView('#negociacoesView');
   private _mensagemView = new MensagemView('#mensagemView');

   constructor() {
    this._negociacoesView.update(this._negociacoes);
    }

    //@logarTempoDeExecucao()
    adiciona (event: Event){

        event.preventDefault();

    //O ERRO OCORRE NA LINHA ABAIXO
        let data = new Date(this._inputData.val().toString().replace(/-/g, '/'));

        if (!this._ehDiaUtil(data)) {
            this._mensagemView.update('As negociações são permitidas apenas em dias úteis!');
            return;
        }

        const negociacao = new Negociacao(
            data,
            parseInt(this._inputQuantidade.val().toString()),
            parseFloat(this._inputValor.val().toString())
        );

        this._negociacoes.adiciona(negociacao);
        this._negociacoesView.update(this._negociacoes);
        this._mensagemView.update('Negociação adicionada com sucesso!');

        /*this._negociacoes.paraArray().length = 0; //Apaga array! Solução na linha 12 de Negociacoes.ts
        this._negociacoes.paraArray().forEach(negociacao => {
            console.log(negociacao.data);
            console.log(negociacao.quantidade);
            console.log(negociacao.valor);
            console.log(negociacao.volume);
        })*/
   }

   private _ehDiaUtil(data: Date) {

    return data.getDay() != DiaDaSemana.Sabado && data.getDay() != DiaDaSemana.Domingo;
};

}

enum DiaDaSemana {

    Domingo,
    Segunda,
    Terca,
    Quarta,
    Quinta,
    Sexta,
    Sabado
}

domInject.ts

export function domInject (seletor: string) {

    return function (target: any, key: string) {

        let elemento : JQuery;
        const getter = function() {
            if (!elemento) {
                console.log(`Buscando elemento ${seletor} do DOM para injetar em ${key}! `);
                elemento = $(elemento);
            }
            return elemento;
        }

        Object.defineProperty(target, key, {
            get: getter
        });
    }    
}

Por favor, se alguém puder me ajudar agradeço!

EDUARDO

1 resposta
solução!

Fala ai Eduardo, tudo bem? O problema está no seu domInject, repare como você está buscando o elemento na página:

elemento = $(elemento);

Na verdade, você deveria passar o seletor para o jQuery buscar o elemento, ficando:

elemento = $(seletor);

Espero ter ajudado.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software