2015-09-08 27 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