使用AngularJS进行SPA设计——在一些页面上共享状态,但不是所有页面

SPA design with AngularJS - sharing state across some, but not all, pages

本文关键字:状态 共享 进行 设计 AngularJS 使用 SPA      更新时间:2023-09-26

如何在Angular中实现这样的东西:

我有一个多页用户交互,它在页面/控制器之间共享状态。页A启动了一个跨页B、C和d的多页进程。我需要在页B-C- d之间共享状态,但是一旦用户返回到页A(无论是完成,还是中途放弃),共享的B-C- d状态就会消失。

我可以把共享状态放在一个服务中,这样就可以跨页面共享了。但它是整个应用的全局单例。是否有办法确保在事务被放弃或完成时处理服务?

在服务器端,Java EE的世界里,这被称为"对话作用域"——我想知道在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()函数来处理所有的情况。