AngularJS:使用URL参数保持应用程序状态

时间:2015-07-01 14:19:20

标签: javascript php angularjs

我已就此主题进行了一些研究,但我似乎无法前进,很可能是因为无法使用正确的关键字来解释我的问题。

我正在使用AngularJS开发一个网站,其上的一些用户操作需要身份验证,例如将某个项目添加到收藏夹,评论帖子,关注用户等等。

每当一个人(非登录用户)尝试执行此操作之一时,系统会提示他使用模式执行登录操作。为了更好地处理应用状态和一致性,我正在重新加载页面。 这意味着在登录之前丢失用户所处的状态。想象一下,尝试收集过滤搜索产生的项目,结果用无限滚动分页;在整页重新加载后处理所有这些信息似乎不可行,因为数据保存在控制器的$ scope中。我试图选择一个边缘案例,这样你就可以更好地理解我的情况的严重性。

有没有办法在Angular上保持状态,例如PHP如何处理它,通过在URL上附加这些参数并在满足所有必要条件时执行它们?

解决这个问题,可能会帮助我解决其他问题,例如在发送简报时,我会发送一个带有用户执行操作的URL,例如:

http://www.example.com/like?item=123412

意味着用户会尝试喜欢/喜欢这个特定的项目。如果已经登录,就像它一样,否则提示登录并在之后执行。

关于这个问题我建议采用参数方法,但你碰巧知道任何其他问题,我可以接受任何可能指向正确方向的建议。

谢谢。

3 个答案:

答案 0 :(得分:2)

是的,请查看存储空间。在MDN上:https://developer.mozilla.org/en/docs/Web/Guide/API/DOM/Storage#localStorage

有很多角度包可供您处理。 localStorage和JWT也有一些很好的捆绑包。

在这里,我找到了一个很好的例子,说明如何在没有包的情况下做到这一点:https://stackoverflow.com/a/25430797/2433843(看看Plunker演示)

修改:必须查找名称,但angular-locker发现here有点为我解决了。我将它与用于Laravel的开发人员JWT软件包结合使用,但是如果你在搜索引擎中输入angular storage,还有更多内容,例如ngStorage(注意:尽管不是官方的,尽管ng找到here)。

答案 1 :(得分:0)

好吧,让我们说这些是你的状态每个视图你都有一个状态,在这个例子中你有登录/强制/设置所以当用户改变状态你通过听$ stateChange捕获他并重定向如果他不被允许去那里

.config(function($stateProvider, $urlRouterProvider, $ionicConfigProvider) {
$stateProvider

// setup an abstract state for the tabs directive
.state('login', {
params: 8,
url: "/login",
templateUrl: "templates/login.html",
controller: "LoginCtrl"
})

.state('settings', {
  params: 8,
  url: '/settings',
  templateUrl: "templates/settings.html",
  controller: "SettingsCtrl"
   })

.state('mandant', {
params: 8,
url: '/mandant',
templateUrl: "templates/mandant.html",
controller: "MandantCtrl"
})
});

在您的MainController中,您只需使用

 $rootScope.$on('$stateChangeSuccess', function (ev, to, toParams, from, fromParams) {
    if(userLoggedIn == true){
      //user is allowed
    }else{
      //user is not allowed
     $location.path('/login');
    }
});

所以你只是检查某种登录令牌或会话,如果它不存在你只是将用户重定向到登录或其他

答案 2 :(得分:0)

就个人而言,我这样做,基本上只是将信息存储在服务中!

myApp.service('viewStateService', function() {
    this.someController['data'] = '';
    this.someController['currentRecord'] = '';
    // basically add as many properties as you like.
});

myApp.controller('someController', function($scope, viewStateService){
  if(viewStateService.data != ''){
     $scope.data = viewStateService.someController['data'];
     $scope.currentRecord = viewStateservice.someController['currentRecord'];

  } else {
    // grab the data normally.
  }

  $scope.$on("$destroy", function() {
     viewStateService.someController['data'] = $scope.data;
     viewStateService.someController['currentRecord'] = $scope.currentRecord;
  });
});

我在我的手机上,所以这是未经测试的,但基本上只是存储服务所需的任何信息,然后在控制器加载时再调用它。