У меня возникла проблема, которую я решил противно, но я предлагаю ее здесь, чтобы узнать, есть ли лучший способ.AngularJs, используя неинжекторную услугу внутри обратных вызовов
Я использую angular-websocket
для передачи данных через Интернет, и я сделал простой сервис под названием Protocol
, который использует $websocket
с потоком обмена сообщениями.
Вот упрощенно версия Protocol
службы:
app.service('Protocol', [ '$websocket',
function ($websocket) {
this.variable = 'to be changed in event' ;
this.connect = function() {
this.ws = $websocket('ws://mydomain.org') ;
this.ws.onOpen(function() {
// when i'm here the this pointer is a $websocket, not Protocol
// so i made Protocol a global variable to be able to use it here
Protocol.variable = 'new value' ;
});
}])
Как описано в комментарии я сделал протокол глобальной, чтобы иметь возможность использовать его внутри onOpen
. В связи с тем, что обратный вызов вызывается $websocket
, тогда указатель this
внутри onOpen
не является Protocol
.
Есть ли более чистый способ изменить this.variable
без каких-либо глобальных?
Первый способ, очевидно, мне нравится его ремонтопригодности исходного кода, второй выглядит более сложным. – Falco
Я согласен с тем, что первый метод предпочтительнее, но есть ситуации, когда требуется привязка. Связывание становится действительно беспорядочным, когда вам нужно вставлять обратные вызовы – matthewdaniel