2016-03-14 3 views
1

Мне нужна служба, которая останется экземпляром в течение срока действия приложения и предложит основные свойства, похожие на синтаксис C#. Например, если я создаю службу profile, я хотел бы получить и установить User из моего контроллера со следующим синтаксисом;Угловой сервис Singleton Использование?

activate(); 

function activate() { 
    vm.user = profile.user; 
} 

function login (user, pass) { 
    api.login(user, pass) 
     .then(function(response){ 
      profile.user = response.data; 
      vm.user = profile. 
     }); 
} 

Является ли следующий пример правильно для этого? ..

(function() { 

    'use strict'; 

    angular 
     .module('blocks.auth') 
     .service('profile', profileService); 

    profileService.$inject = []; 
    function profileService() { 

     this._user; 

     this.user = { 
      get function() { 
       return this._user; 
      }, 
      set function (value) { 
       this._user = value; 
      } 
     }; 

    } 

})(); 

Извините за новичка вопрос, но синтаксис на сервисе выглядит невероятно странным и запутанным.

+0

да синтаксис правильный –

+0

Вы уверены, что можете подключить функции приемника и сеттера таким образом? Я никогда не видел этот синтаксис в Angular (это не значит, что это невозможно). – Lex

+0

Есть ли более чистый или более логичный синтаксис? –

ответ

3

После также поставляются с C#/.NET, я думаю, что я знаю, что возиться с вашей головы. Возможно, ваш мозг все еще думает о масштабах и определениях переменных, которые вы привыкли видеть.

Вот как я бы структурировать услуги:

(function() { 

    'use strict'; 

    angular 
     .module('blocks.auth') 
     .factory('profile', profileService); 

    function profileService() { 

     var _user = {}; 

     var service = { 

      // User (read/write) 
      get user() { 
       _user = _user || {}; 
       return _user; 
      }, 
      set user (value) { 
       if (value && !value.id) { return; } 
       _user = value || {}; 
      }, 

      // isUserLoaded (read only ... no setter) 
      get isUserLoaded() { 
       return (_user && _user.id != null); 
      }, 

      // Clear (similar to class method) 
      clear : function() { 
       _user = {}; 
      } 

     }; 

     return service; 
    } 

})(); 

Думай о service объекта как ваш class в C#. Это все еще использует ваше подчеркивание для локальной переменной, чтобы вы могли видеть ее немного лучше. Heck, вы также можете переместить переменную _user в объект service, если хотите немного подражать классу C#. Затем, get ters и set ters практически идентичны.

Единственная странность - это функция clear(), которую я добавил ... главным образом из-за синтаксиса.

+0

О, мужик! Спасибо огромное! Ваше объяснение именно то, что мне нужно. Это определенно мостирует пробел C# -to-JavaScript для меня. знак равно –

1

Да, угловое обслуживание одноточечное. Просто убедитесь, что вы вводите службу в свой контроллер.

Что-то, как показано ниже (непроверенные):

angular.module('blocks.auth').controller('myController', function ($scope, api) { 
 
    
 
    $scope.activate() { 
 
    vm.user = profile.user; 
 
    } 
 

 
    $scope.login (user, pass) { 
 
    api.login(user, pass) 
 
     .then(function(response){ 
 
      profile.user = response.data; 
 
      vm.user = profile. 
 
     }); 
 
    } 
 
    
 
    $scope.activate(); 
 
    
 
})

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