我已经找到了很多关于此类错误的问题,并且我精疲力竭地找到了对我不起作用的解决方案...为什么在图片上未定义“ 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));
}
非常感谢!
更新
在Line 62的调试器标记的行之前,将this定义为this.usuario和this.mostrarBotaoResetarSenha。
但是,在line 64,这些都未定义
答案 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));
}