2015-09-08 65 views
1

之前我使用AngularJS,UI路由器和$資源REST風格的Web服務。

在HTML視圖的按鈕被點擊調用下面函數即$ scope.login()。因此REST服務(通過$資源)被調用,並在情況下,用戶會返回一個用戶名/密碼是正確的,

$scope.login = function() { 
myfactory.get({ 
     email: $scope.user.email, 
     password: $scope.user.password 
    },function(user) { 
     accessmgr.grantAccess(user);  //Line of interest - loi1 
     $state.go('app.dashboard-v1'); //Line of interest2 - loi2 
    }, function(x) { 
     if (x.status == 401) 
      $scope.authError = 'Email or Password not right'; 
     else 
      $scope.authError = 'Server Error! Are you connected to internet?'; 
    }); 
} 
萬一

以上的成功執行,另一家工廠的功能(loi1以上)被調用,以存儲用戶的實例中$ localStorage如下;

myapp.factory('accessmgr', function($localStorage) { 
    //var User = {}; 
    return {grantAccess: function(usr) { 
      $localStorage.user = usr; 
     } 
    }}); 

和ui-router $ scope.go(...)將用戶帶到儀表板。

問題: 有時 $ state.go(...)accessmgr.grantAccess之前執行(...)導致異常作爲新的國家從還沒寫$的localStorage讀取用戶。手動重新加載頁面可以解決問題。

任何幫助將非常感激。

+0

等待承諾從''grantAccess''然後執行$ state.go像返回''accessmgr.grantAccess(用戶)。然後(功能(響應){$ state.go( 'app.dashboard-V1'); })'' –

+0

我認爲promise/then僅適用於$ http或$ resource之類的回調?在我的情況下,它只是另一個功能將用戶保存到$ localStorage。無論如何,我嘗試過,但報道對鉻'類型錯誤的控制檯錯誤:無法爲$ promise.then'讀undefined'的屬性「然後」與同類型錯誤:無法讀取性能undefined' – hammad

+0

承諾的「$承諾」可以用來與任何異步服務,只要服務是基於承諾(和$ localStorage不是)。 – estus

回答

0

ngStorage的$ localStorage的不能在沒有使用觀察者(未推薦爲每here直接引用,或者它可以作爲作爲推薦的方法here提及被作爲參考,以勾$範圍通過。

對我來說,我通過工廠使用$ localStorage的是,我又把它下面綁rootScope;

$rootScope.$storage = $localStorage; 

,因此

myapp.factory('accessmgr', function($localStorage) { 
    $rootScope.$storage = $localStorage; 
    return { 
    grantAccess: function(usr) { 
     $rootScope.$storage.user = usr; 
     }, 
    getUser: function() { 
     return $rootScope.$storage.user; 
     } 
    }}); 
0

localStorage的本身工作在同步方式,但ngStorage的$的localStorage沒有。後者旨在與範圍和is tied to Angular digest cycles結合使用。我的猜測是

myapp.factory('accessmgr', function($localStorage) { 
    return {grantAccess: function(usr) { 
      $localStorage.user = usr; 
      $localStorage.$apply(); 
     } 
    }}); 

可能會有所幫助。 ngStorage在使用像這樣的時候並不真正發光,可能JS通用庫如store.js應用得更好。

一個好的替代方案是使用模型充當真理的作爲單一源和引擎蓋下轉儲數據到localStorage的。根據項目的規模,js-data-angular可以被認爲是一個可靠的解決方案。

+0

$ localStorage。$ apply()拋出一個錯誤,因爲ngStorage localStorage似乎沒有這個功能。 TypeError:無法讀取屬性'$ apply ....'。無論如何感謝指出我正確的方向,因爲我實際上使用ngStorage的localStorage,我沒有提到它在我的問題。下面的答案是什麼解決了我的問題。 – hammad

+0

其API可能隨時間而改變,但在最近的版本中[有$ apply](https://github.com/gsklee/ngStorage/blob/master/ngStorage.js#L158),這意味着立即同步存儲數據。 – estus