2016-03-14 50 views
1

我需要一個在應用程序生命週期中保持實例化的服務,並提供基本屬性,類似於C#語法。例如,如果我創建了一個profile服務,我想用以下語法從我的控制器中獲取並設置User;AngularJS服務單例使用?

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

yes語法正確 –

+0

您確定可以連接getter和setter函數嗎?我從來沒有在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對象當成自己用C#class。這仍然使用你的下劃線作爲局部變量,所以你可以看到它更好一點。哎呀,你也可以將_user變量移動到service對象,如果你想模擬C#類更接近。然後,get ters和set ters幾乎是相同的。

奇怪的是我添加的clear()函數......主要是因爲語法。

+0

哦,夥計!非常感謝!你的解釋正是我需要的。它絕對爲我提供了C#到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(); 
 
    
 
})