This.sanitizer не определен вне функции NgOninit (Angular, TS)

Сначала я импортировал DomSanitizer в компонент:

import { DomSanitizer, SafeResourceUrl} from '@angular/platform-browser';

После этого я создал класс и добавил его в конструктор:

 export class BlocklyComponent implements OnInit {
      primaryWorkspace: Blockly.WorkspaceSvg;
      GEE = "PCFET0NUWVBFIGh0bWw+Cgo8aGVhZD4KPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc...";
    public geeMap: SafeResourceUrl;
      constructor(private sanitizer: DomSanitizer) {}
ngOnInit() {

Внутри функции NgOnInit работает корректно, однако в функции updateURL (вне NgOnInit, но внутри класса) пишет, что this.sanitizer не определен:

//Creates de src that has to be in the iframe. What I need to do is to update this safeResourceUrl.
        this.geeMap = this.sanitizer.bypassSecurityTrustResourceUrl(`data:text/html;base64,${this.GEE}`);

        //Reads the events in a workspace. When it notices a change, it triggers the updateURL function

        primaryWorkspace.addChangeListener(this.updateURL);

      }
      updateURL(primaryEvent) 
         {
          if (primaryEvent.isUiEvent) {
            return; //Do not clone ui events 
          };
          console.log('hola');
         //Problem. Here it sais that this.sanitizer is undefined.
          this.geeMap = this.sanitizer.bypassSecurityTrustResourceUrl(`data:text/html;base64,${this.GEE}`);
        }

Я знаю, что это типичная проблема, которая случалась со мной много раз, однако теперь я не знаю, как ее решить. Я пытался найти неопределенную проблему на разных форумах, но так и не смог ее решить. Большое спасибо


person Sam    schedule 09.03.2021    source источник


Ответы (1)


Поскольку вы выходите из Angular потока событий привязки, вы можете добавить прослушиватель событий двумя способами, чтобы позаботиться о правильном this :-

Стрелочные функции (внутри ngOnInit):-

primaryWorkspace.addChangeListener((event)=>this.updateURL(event));

.bind (внутри constructor):-

this.updateURL = this.updateURL.bind(this);

А в ngOnInit :-

primaryWorkspace.addChangeListener(this.updateURL);

Также я думаю, что вы имели в виду addEventListener('change',...) вместо addChangeListener.

person Lakshya Thakur    schedule 09.03.2021
comment
Большое спасибо, Лакшия. Второй вариант меня вполне устроил. Я действительно боролся с этой ошибкой, и вы решили ее. Что касается addEventListener, о котором вы мне сказали, я не могу его написать, потому что использую библиотеку Blockly, а события нужно читать с помощью addChangeListener. Еще раз спасибо - person Sam; 09.03.2021