AngularJS – Директива – функция onClick, вызывающая $http(POST) – $http не определена?

У меня есть директива AngularJS, которая без проблем вызывает данные из API с помощью $http (ng.IHttpService).

У меня есть событие «щелчок», связанное с функцией, и я хочу вызвать запрос POST на тот же контроллер API, чтобы поместить некоторые данные в базу данных.

Вот директива

import { Advert } from "../entities";

interface AdvertScope extends ng.IScope {
    advert: Advert;
}

export class AdvertDirective implements ng.IDirective {    
    restrict = 'EA';
    templateUrl = '/AngularViews/adverts.html';
    scope = {}

    constructor(private $http: ng.IHttpService) { }

    public link = (scope: AdvertScope, elem: JQuery, attributes: ng.IAttributes, ngModel: ng.INgModelController) => {
        this.$http.get<Advert>('/api/adverts/get-adverts')
            .then(response => {
                scope.advert = response.data;
            });

        elem.bind('click', function (e: any): void {
            var advertId = e.path[0].id;

            if (advertId != null && advertId != undefined) {
                var data = { advertId: advertId };

                // This is just a fire-and-forget post - no success/error handling   
                this.$http.post('/api/adverts/log-click', JSON.stringify(data));
            }
        });        
    }

    static factory(): ng.IDirectiveFactory {
        var directive = ($http: ng.IHttpService) => new AdvertDirective($http);
        directive.$inject = ['$http']
        return directive;
    }

}

Проблема в том, что когда происходит событие клика, ошибка:

Uncaught TypeError: Невозможно прочитать сообщение свойства undefined

генерируется.


person Alastair Gordon    schedule 04.07.2019    source источник
comment
Я думаю, вы этого не понимаете. Используйте функцию стрелки () =› {}   -  person Saima Haji    schedule 04.07.2019
comment
Спасибо Сайма. Точно. Как и Мири внизу. Спасибо.   -  person Alastair Gordon    schedule 04.07.2019


Ответы (1)


Когда вы пишете «функция», «это» относится к самой функции. Вам просто нужно заменить «функция» на () =>{} следующим образом:

elem.bind('click',  (e: any): void=> {
    var advertId = e.path[0].id;

    if (advertId != null && advertId != undefined) {
        var data = { advertId: advertId };

        // This is just a fire-and-forget post - no success/error handling   
        this.$http.post('/api/adverts/log-click', JSON.stringify(data));
    }
});  
person Miri Gold    schedule 04.07.2019