Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用AngularJS的SPA设计-在部分(但不是全部)页面上共享状态_Javascript_Angularjs_Single Page Application - Fatal编程技术网

Javascript 使用AngularJS的SPA设计-在部分(但不是全部)页面上共享状态

Javascript 使用AngularJS的SPA设计-在部分(但不是全部)页面上共享状态,javascript,angularjs,single-page-application,Javascript,Angularjs,Single Page Application,您将如何在Angular中实现这样的功能: 我有一个多页面的用户交互,可以跨页面/控制器共享状态。页面A跨页面B、C和D启动多页面进程。我需要在页面B-C-D之间共享状态,但一旦用户返回到页面A(完成时或中途放弃),共享的B-C-D状态应消失 我可以将共享状态放在一个服务中,这样就可以跨页面进行共享。但对于整个应用程序来说,它是一个全局单例。如果事务被放弃或完成,是否有办法确保服务被处置 在服务器端的JavaEE世界中,这被称为“对话范围”——我想知道在Knockout或Angular中的等价物

您将如何在Angular中实现这样的功能:

我有一个多页面的用户交互,可以跨页面/控制器共享状态。页面A跨页面B、C和D启动多页面进程。我需要在页面B-C-D之间共享状态,但一旦用户返回到页面A(完成时或中途放弃),共享的B-C-D状态应消失

我可以将共享状态放在一个服务中,这样就可以跨页面进行共享。但对于整个应用程序来说,它是一个全局单例。如果事务被放弃或完成,是否有办法确保服务被处置

在服务器端的JavaEE世界中,这被称为“对话范围”——我想知道在Knockout或Angular中的等价物是什么


还是有更好的方法来设计?我应该使用嵌套控制器吗

这是一个相当广泛的问题,肯定会引起一些基于意见的回应。也就是说,你可以依赖的一件事是服务业(和工厂)都是单身。这意味着,如果您需要在控制器之间共享数据,或者在SPA的整个生命周期中共享数据,您可以创建一个服务来保存和共享该数据。只要不重新加载页面,该服务及其数据就会存在

共享数据工厂的基本模式如下所示:

// define the shared data service
app.factory("SharedData", function () {
  return {
    // just one data object for the purposes of the example
    sharedDataObject: {}
  };
});
定义服务后,您可以定义使用该服务的控制器,如下所示:

app.controller("FirstController", function ($scope, SharedData) {
  $scope.localData = SharedData.sharedDataObject;
});
因为我们已经将共享数据定义为一个对象,而不是一个值-绑定到“localData”将允许我们设置可以检索的值,只要页面没有更改。我将显示两个控制器之间共享数据的内容放在一起。如果控制器位于不同的视图上,此模式也同样有效

再说一次——我不确定这是否是推荐的模式,但这是我在附近见过的一种模式,而且效果非常好。祝你好运



注意-您的问题中引用了此答案-因此它可能并不完全是您想要的答案。也就是说,我在为其他可能需要在SPA上保存状态的简单方法的人发帖。

如果您将共享状态放入服务,只需向其中添加一个reset()函数,当他们转到“a”步骤或完成该过程时,就会调用该函数


我想你也可以用一个嵌套的控制器。您可能仍然需要添加reset()函数来处理所有情况

您能否补充一些详细信息,说明为什么您认为某项服务不适合您的需要?某项服务可以工作,但其寿命比我需要的要长。这可能不是您想要的,但如果您想控制寿命,为什么不回到基础并使用cookies呢?是的,这是可行的。我的问题是,当您的状态不是真正的全局状态,但只需要一部分页面时,是否有更好的方法-是否有方法将sharedDataObject的范围限制到该页面集群?@wrschneider99我想我是在建议使用此方法+服务可以侦听“$locationChangeStart”和“$locationChangeSuccess”足够写下你想要的东西了。除了服务、工厂和全局变量(颤抖)之外,我还没有看到任何特别好的维护状态的方法。只有我的两分钱!