2017-01-29 1 views
1

Я удалил некоторые материалы для удобочитаемости.Служба Coffeescript AngularJS, не может получить доступ к функциям участника, используя @ notation

Я написал службу пользователя, используя систему класса CoffeeScript, но это создает проблемы при попытке доступа к ее собственным функциям-членам.

User = (...) -> 
    'ngInject' 

    new class User 

     constructor: -> 
      @setRole() 

     login: (params) -> 
      params.grant_type = 'password' 

      request = {...} 

      $http(request).then (response) -> 
       $window.localStorage.token = response.data.access_token 
       payload = jwtHelper.decodeToken(response.data.access_token) 
       $rootScope.$broadcast EVENTS.AUTH.LOGIN 
       @setRole() # PROBLEM LINE 
      , (response) -> 
       if response.status == 400 
        $rootScope.$broadcast EVENTS.ERROR.BAD_REQUEST 
      ... 

При попытке вызвать @setRole(), браузер сообщает мне, что setRole() не существует:

TypeError: Cannot read property 'setRole' of undefined

компилируется к этому:

User = [..., function(...) { 
    'ngInject'; 

    return new (User = (function() { 
     function User() { 
     this.setRole(); 
     console.log("User service loaded"); 
     } 

     User.prototype.login = function(params) { 
     var request; 
     params.grant_type = 'password'; 
     request = {...} 
     }; 
     return $http(request).then(function(response) { 
      var payload; 
      $window.localStorage.token = response.data.access_token; 
      payload = jwtHelper.decodeToken(response.data.access_token); 
      $rootScope.$broadcast(EVENTS.AUTH.LOGIN); 
      return this.setRole(); # WRONG this, I PRESUME 
     }, function(response) { 
      if (response.status === 400) { 
      return $rootScope.$broadcast(EVENTS.ERROR.BAD_REQUEST); 
      } 
     }); 
     }; 
     ... 

Мой вопрос: почему я не могу ссылаться на User.setRole() в моей собственной службе, используя нотацию @? Есть ли обходной путь для этого? Я полагаю, что это имеет какое-то отношение к этому указателю, не соответствующему экземпляру пользователя.

ответ

1

Проблема в том, что в функции вы переходите на then, this изменений. Чтобы сохранить это значение, используйте синтаксис толстой стрелки (=>):

$http(request).then (response) => 
+1

Похоже, что это решило! Спасибо. –