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

o JSON.parse nao funciona

class Controller{
constructor(){

this._input = document.querySelector('#input');
this._modeloDeRegistros = new ModeloDeRegistros();
this._registroView = new RegistroView(document.querySelector('#mercurio'));

}
_cast(){
event.preventDefault(event);
this._modeloDeRegistros.adicionaRegistro(new Registro(
this._input.value
));
let string = (this._modeloDeRegistros.ficheiro);
localStorage.setItem("ficheiro", string)
this._modeloDeRegistros.ficheiro = JSON.parse(JSON.stringify(localStorage.getItem("ficheiro")));
this._registroView.update(this._modeloDeRegistros);
}
}

recebo uma mensagem no console assim: ModeloDeRegistros.js:7 Uncaught TypeError: this._ficheiro.push is not a function

4 respostas

Poderia postar a classe ModeloDeRegistros para nós vermos. porque ao que parece ta dando erro quando você tenta estanciar o objeto

class ModeloDeRegistros {
constructor(){
this._ficheiro = [];
}

adicionaRegistro(obj) {
this._ficheiro.push(obj);
}
get ficheiro() {
return [].concat(this._ficheiro);
}
set ficheiro(fchr) {
  this._ficheiro = fchr;
}
}

Pelo que eu entendi quando o método _cast é chamado ele adiciona o input no ficheiro depois ele deveria colocar o ficheiro no local storage depois pegar o ficheiro que esta no local storage e usar na template pra fazer a view. Porem depois que ele tira o ficheiro do local storage ele não esta sendo transformado pelo JSON em um objeto e quando o _cast tenta adicionar o input no ficheiro o push da erro pq não é mais um vetor e sim uma string. Qual deveria ser o código certo para que quando um input seja adicionado ele também seja armazenado no local storage e depois recuperado para ser usado na view?

solução!

Entendi o que aconteceu... na linha

this._modeloDeRegistros.ficheiro = JSON.parse(JSON.stringify(localStorage.getItem("ficheiro")));

Você atribui direto o valor do array. nesse caso você deveria dar o push ai. desta forma:

this._modeloDeRegistros.ficheiro.push(JSON.parse(JSON.stringify(localStorage.getItem("ficheiro"))));

Pois da outra forma como ele Recebia um getItem do local storage, ele passava a ser do tipo string; E como o localStorage não tem metodo push, por trabalhar com string. Você recebia esse erro "push is not a function".

Documentação do Storage.

https://developer.mozilla.org/pt-BR/docs/Web/API/Storage

Tenta dessa forma. Qualquer coisa só chamar.

Realmente funcionou, a cada clica e adicionado o texto do input linha a linha. Porem refiz o código dessa forma:

_setter(){
let string = (this._modeloDeRegistros.ficheiro);
localStorage.setItem("ficheiro", string);
}
_getter(){
this._modeloDeRegistros.ficheiro.push(
  JSON.parse(JSON.stringify(localStorage.getItem("ficheiro")))
);console.log(this._modeloDeRegistros.ficheiro);
}
_updater(){
this._registroView.update(this._modeloDeRegistros);
}

_cast(){
  event.preventDefault(event);
this._getter();
this._modeloDeRegistros.adicionaRegistro(new Registro(
this._input.value
));
this._setter();

this._updater();
}

}

e ao clicar o botão o vetor de parágrafos aumenta, mas ao dar F5 o _getter() devolve um vetor vazio. Não estou entendendo isso direito.....como também não entendi se devo abrir outra discussão ou se já abri......