2015-12-06 2 views
0

У меня возникла проблема, которую я решил противно, но я предлагаю ее здесь, чтобы узнать, есть ли лучший способ.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 без каких-либо глобальных?

ответ

1

Я всегда бросаю это в локальный var, чтобы получить доступ к нему, не беспокоясь об этом перекодировании.

app.service('Protocol', [ '$websocket', 
    function ($websocket) { 
     this.variable = 'to be changed in event' ; 

     this.connect = function() { 
      var me = this; 

      me.ws = $websocket('ws://mydomain.org') ; 

      me.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 
      me.variable = 'new value' ; 
     }); 
}]) 

Если вам не нравится, что вы могли бы также связать вашу функцию

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 
       this.variable = 'new value' ; 
      }); 
     }).bind(this) 
}]) 
+0

Первый способ, очевидно, мне нравится его ремонтопригодности исходного кода, второй выглядит более сложным. – Falco

+0

Я согласен с тем, что первый метод предпочтительнее, но есть ситуации, когда требуется привязка. Связывание становится действительно беспорядочным, когда вам нужно вставлять обратные вызовы – matthewdaniel

Смежные вопросы