Обратный звонок в неправильной области

У меня есть проблема, и я не могу вспомнить, как ее обойти. Я подписываюсь на обратный вызов из сторонней директивы, но мне не перезванивают с правильной областью действия. И под этим я подразумеваю, что когда он попадает в мой контроллер this на самом деле это какая-то другая область, которую я не могу понять, поэтому она не может получить доступ к переменным-членам. Как мне вернуться в область действия моего контроллера?

<ui-gmap-layer type="HeatmapLayer" onCreated="$ctrl.heatLayerCallback"></ui-gmap-layer>

Контроллер компонентов:

heatLayerCallback(heatLayer: google.maps.visualization.HeatmapLayer) {
    this.heatMapLayer = heatLayer;
    // 'this' here is not my controller
}

Если я перезвоню

<ui-gmap-layer onCreated="$ctrl.heatLayerCallback(layer)"></ui-gmap-layer>

Затем мой обратный вызов выполняется в нужной области (т.е. мой контроллер), но параметр layer потерян;/

Заметки

Я использую Typescript, Angular 1.6 и Angular Components

1 ответ

Решение

Вы можете использовать bind для привязки обратного вызова к нужному контексту (вашему контроллеру) или просто сохранить его в другой новой переменной перед обратным вызовом и получить к нему доступ через эту переменную в обратном вызове.

Что-то вроде:

var heatLayerCallback = (function(heatLayer: google.maps.visualization.HeatmapLayer) {
    this.heatMapLayer = heatLayer;
    // 'this' here is now the same as the 'this' outside/below
}).bind(this); // bind to this or whatever context you want

...или же:

var that = this; // store this or whatever context you want
...
heatLayerCallback(heatLayer: google.maps.visualization.HeatmapLayer) {
    that.heatMapLayer = heatLayer;

Точный синтаксис может варьироваться в зависимости от того, где находится ваш цитируемый код (например, найдите, где "this" - то, что вам нужно, или используйте любой контекст вместо "this").

Другие вопросы по тегам