9
respostas

Meu template não renderiza

Bom diia professor, meu template não está renderizando, gera a mensagem que o innerHTML não pode ser nulo, mas ele não está nulo, meu código está igual ao da aula, não tenho ideia do que pode ser Insira aqui a descrição dessa imagem para ajudar na acessibilidade Insira aqui a descrição dessa imagem para ajudar na acessibilidade `import { Negociacoes } from "../models/negociacoes.js";

export class NegociacoesView {

private elemento: HTMLElement;

constructor(seletor: string) { this.elemento = document.querySelector(seletor); }

template(model: Negociacoes): string { return <table class="table table-hover table-bordered"> <thead> <tr> <th>DATA</th> <th>QUANTIDADE</th> <th>VALOR</th> </tr> </thead> <tbody> ${model.lista().map(negociacao => { return

?${negociacao.quantidade}${negociacao.valor}
; }).join('')} </tbody> </table>; }

update(model: Negociacoes):void { const template = this.template(model); console.log(template) this.elemento.innerHTML = template ; } }`

9 respostas

Oi Rodrigo,

Eu não sei se vc está conseguindo ver minha resposta (porquê eu não estou), então vou postar novamente.

Eu tive o mesmo erro, e dpeois de quebrar um pouco a cabeça encontrei nosso problema.

Vai no arquivo "negociacoes_view.ts", e no trecho do constructor altera o "querySelector" pra:

constructor(seletor: string) {
        this.elemento = <HTMLElement> document.querySelector(`#${seletor}`);
    }

O meu funcionou depois da alteração. Espero que o seu também dê certo.

:)

do modo que fazíamos ele puxava apenas uma string e não um ID, por isso tava "null"

Boa tarde Gabriela, muito obrigado pela ajuda, mas ainda continua sem funcionar, mesmo implementando a sua solução.

ele aparece o mesmo erro Rodrigo? disponibiliza o código por favor. Não sou muito conhecedora mas posso tentar ajudar.

na aula seguinte o Flavio altera no Negociacoes-controller, na hora de chamar o Negociacoes-View("#negociacoesView"), as vezes dessamaneirafuncione, não sei. E ai no Negociacoes_view você deixaria apenas "seletor".

Oi Gabriela, bom dia, mesmo seguindo a próxima aula o erro persiste, não tô conseguindo encontrar onde estou errando, desculpe a demora, pois, também estou fazendo outros cursos além do trabalho e faculdade, obrigado pela ajuda:

meu index.html

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <title>Negociações</title>
    <link rel="stylesheet" href="css/bootstrap.css" />
  </head>

  <body class="container">
    <h1 class="text-center">Negociações</h1>

    <div id="mensagemView"></div>

    <form class="form">
      <div class="form-group">
        <label for="data">Data</label>
        <input type="date" id="data" class="form-control" required autofocus />
      </div>

      <div class="form-group">
        <label for="quantidade">Quantidade</label>
        <input
          type="number"
          min="1"
          step="1"
          id="quantidade"
          class="form-control"
          value="1"
          required
        />
      </div>

      <div class="form-group">
        <label for="valor">Valor</label>
        <input
          id="valor"
          type="number"
          class="form-control"
          min="0.01"
          step="0.01"
          value="0.0"
          required
        />
      </div>

      <button class="btn btn-primary" type="submit">Incluir</button>
    </form>
    <br />
    <br />
    <div id="negociacoesView"></div>
    <script type="module" src="js/app.js"></script>
  </body>
</html>

esse é o meu negociacao-controller.ts

import { Negociacao } from '../models/negociacao.js';
import { Negociacoes } from '../models/negociacoes.js';
import { NegociacoesView } from './../views/negociacoes-view.js';

export class NegociacaoController {
    private inputData: HTMLInputElement;
    private inputQuantidade: HTMLInputElement;
    private inputValor: HTMLInputElement;
    private negociacoes = new Negociacoes();
    private negociacoesView = new NegociacoesView('#negociacoesViews');

    constructor() {
        this.inputData = document.querySelector('#data');
        this.inputQuantidade = document.querySelector('#quantidade');
        this.inputValor = document.querySelector('#valor');
        this.negociacoesView.update(this.negociacoes);
    }

    adiciona(): void {
        const negociacao = this.criaNegociacao();
        negociacao.data.setDate(12);
        this.negociacoes.adiciona(negociacao);
        this.negociacoesView.update(this.negociacoes);
        this.limparFormulario();
    }

    criaNegociacao(): Negociacao {
        const exp = /-/g;
        const date = new Date(this.inputData.value.replace(exp, ','));
        const quantidade = parseInt(this.inputQuantidade.value);
        const valor = parseFloat(this.inputValor.value);
        return new Negociacao(date, quantidade, valor);
    }

    limparFormulario(): void {
        this.inputData.value = '';
        this.inputQuantidade.value = '';
        this.inputValor.value = '';
        this.inputData.focus();
    }
}

esse é o meu negociacoes-view.ts

import { Negociacoes } from "../models/negociacoes.js";

export class NegociacoesView {

  private elemento: HTMLElement;

  constructor(seletor: string) {
    this.elemento = <HTMLElement>document.querySelector(seletor);
  }


  template(model: Negociacoes): string {
      return `
      <table class="table table-hover table-bordered">
        <thead>
          <tr>
            <th>DATA</th>
            <th>QUANTIDADE</th>
            <th>VALOR</th>
          </tr>
        </thead>
        <tbody>
          ${model.lista().map(negociacao => {
            return `
              <tr>
                <td>?</td>
                <td>${negociacao.quantidade}</td>
                <td>${negociacao.valor}</td>
              </tr>
            `;
          }).join('')}
        </tbody>
      </table>
    `;
  }

  update(model: Negociacoes):void {
    const template = this.template(model);
    console.log(template)
    this.elemento.innerHTML = template ;
  }
}

Rodrigo, vc não colocou todo o código que a Gabriela mostrou: "(#${seletor});"

Detalhe: Não é aspas simples.

Rodrigo, ou pra facilitar ainda mais, vc não precisa utilizar o código da Gabriela mas deve corrigir esta linha private negociacoesView = new NegociacoesView('#negociacoesViews');

Na sua div, não está no plural

<div id="negociacoesView"></div>