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

Javascript AngularJS:使用URL参数保持应用程序状态,javascript,php,angularjs,Javascript,Php,Angularjs,我在这个主题上做了一些研究,但我似乎无法前进,很可能是因为无法使用正确的关键字来解释我的问题 我正在用AngularJS开发一个网站,其中一些用户操作需要验证,比如在收藏夹中添加某个项目、评论帖子、跟踪用户等等 每次一个人(未登录用户)尝试执行其中一个操作时,他都会收到一个模式提示以执行登录操作。为了更好地处理应用程序状态和一致性,我正在重新加载页面。 这意味着将丢失用户在登录前的状态。想象一下,尝试收藏一个经过过滤的搜索结果,结果被无限滚动分页;在整个页面重新加载之后,处理所有这些信息似乎是不

我在这个主题上做了一些研究,但我似乎无法前进,很可能是因为无法使用正确的关键字来解释我的问题

我正在用AngularJS开发一个网站,其中一些用户操作需要验证,比如在收藏夹中添加某个项目、评论帖子、跟踪用户等等

每次一个人(未登录用户)尝试执行其中一个操作时,他都会收到一个模式提示以执行登录操作。为了更好地处理应用程序状态和一致性,我正在重新加载页面。 这意味着将丢失用户在登录前的状态。想象一下,尝试收藏一个经过过滤的搜索结果,结果被无限滚动分页;在整个页面重新加载之后,处理所有这些信息似乎是不可行的,因为数据保存在控制器的$scope中。我想挑一个有利的例子,这样你就能更好地理解我处境的严重性

有没有一种方法可以通过在URL上附加这些参数并在满足所有必要条件时执行这些参数来保持状态,例如PHP如何处理状态

解决这个问题可能会在其他情况下对我有所帮助,比如在发送时事通讯时,我会发送一个URL,其中包含用户要执行的操作,例如:

http://www.example.com/like?item=123412
这意味着用户将尝试喜欢/喜爱此特定项目。如果已经登录,则与之类似,否则提示登录并在登录后执行

在这个问题上,我建议使用参数方法,但你碰巧知道其他方法,我愿意接受任何可能为我指明正确方向的建议


谢谢。

是的,请查看存储。关于MDN:

有相当多的角度包可处理这一点为您。对于localStorage和JWT也有一些很好的捆绑包

在这里,我找到了一个关于如何在没有软件包的情况下实现它的好例子:(看看Plunker演示)


编辑:必须查找名称,但
angular locker
为我找到了某种解决方法。我将它与Laravel的开发者JWT软件包结合使用,但如果您在搜索引擎中输入
angular storage
,则会有很多,例如
ngStorage
(注意:尽管找到了
ng
,但不是官方的).

好的,让我们假设这些是您的状态您拥有的每个视图都有一个状态在本例中您有登录/mandant/settings,因此当用户更改状态时,您可以通过收听$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"
})
});
在主控制器中,您可以简单地使用

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

因此,您只需检查某种登录令牌或会话,如果它不存在,您只需将用户重定向到登录或其他任何内容,我个人会这样做,基本上只需将信息存储在服务中

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;
  });
});

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

但这种方法不会将他发送回原来的位置,也不会执行他尝试的操作,因为我们不会保留这些数据。除非我误解了你的例子。这看起来很棒。将不得不对其进行更深入的研究。它并不能解决所描述的所有问题,但它是朝着解决方案迈出的一大步。谢谢