角度4-即使在带有箭头的情况下,ngOnInit()上也未定义“ this”

时间:2018-07-19 17:07:55

标签: angular typescript

我已经找到了很多关于此类错误的问题,并且我精疲力竭地找到了对我不起作用的解决方案...为什么在图片上未定义“ this”?

@Component({
  ...
})
export class UsuarioCadastroComponent implements OnInit {

  usuario = new Usuario();

  mostrarBotaoResetarSenha = false;

  constructor(
    private usuarioService: UsuarioService,
    private autenticacaoService: AutenticacaoService,
    private menuService: MenuService,
    private errorHandler: ErrorHandlerService,
    private baseService: BasesService,
    private route: ActivatedRoute,
    private router: Router) { }

    ngOnInit() {
        const idUsuario = this.route.snapshot.params['id'];

        if (idUsuario) {
          this.carregarUsuario(idUsuario);
        }

        this.popularPickListBasesUsuarios();
        }

    get isEditando() {
        return Boolean(this.usuario.id);
    }

    carregarUsuario(id: number) {
        this.usuarioService.buscarPorId(id)
          .then((usuarioJson) => {
            this.usuario = usuarioJson;

            this.mostrarBotaoResetarSenha = true;

          })
          .catch(erro => this.errorHandler.handle(erro));
    }

See here the 'this' undefined

非常感谢!

更新

Line 62的调试器标记的行之前,将this定义为this.usuario和this.mostrarBotaoResetarSenha。

但是,在line 64,这些都未定义

2 个答案:

答案 0 :(得分:1)

您可以尝试在this方法闭包中添加carregarUsuario()。像

carregarUsuario(id: number) {
  const that = this;

  that.usuarioService.buscarPorId(id)
      .then((usuarioJson) => {
        that.usuario = usuarioJson;

        that.mostrarBotaoResetarSenha = true;

      })
      .catch(erro => that.errorHandler.handle(erro));
}

更新

考虑到这一点,我将尽我所能解释。 There are some waaaayyyy better explainations on S.O. regarding javascript closures,我只知道自己可以进行一些调试。

基本上,promise执行的范围不在您组件的范围内。我认为范围可能是由buscarPorId()方法定义的?不确定。无论如何,通过将this保存为局部变量(that),this进入了与执行承诺相同的范围。

换一种说法,this在javascript中有点神奇/特别,它的含义可以改变。通过将其保存为变量(that),可以确保它不会更改。我敢肯定,一些JavaScript专家会屈服于这种解释:)。阅读我链接到的帖子。更好。

答案 1 :(得分:0)

您是否将mostrarBotaoResetarSenha定义为类属性?

   mostrarBotaoResetarSenha = false; // add this

   ngOnInit() {
    const idUsuario = this.route.snapshot.params['id'];

    if (idUsuario) {
      this.carregarUsuario(idUsuario);
    }

    this.popularPickListBasesUsuarios();
    }

    get isEditando() {
    return Boolean(this.usuario.id);
    }

    carregarUsuario(id: number) {
    this.usuarioService.buscarPorId(id)
      .then((usuarioJson) => {
        this.usuario = usuarioJson;

        this.mostrarBotaoResetarSenha = true;

      })
      .catch(erro => this.errorHandler.handle(erro));
    }