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

时间:2014-03-12 15:34:16

标签: javascript angularjs single-page-application

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

我有一个跨页面/控制器共享状态的多页面用户交互。页面A在页面B,C和D之间启动多页面处理。我需要在页面BCD之间共享状态,但是一旦用户返回到页面A(完成或中途放弃)共享BCD状态应该离开。

我可以将共享状态放在服务中,并且可以在页面之间进行共享。但它是整个应用程序的全局单例。如果交易被放弃或完成,有没有办法确保处理服务?

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

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

2 个答案:

答案 0 :(得分:2)

这是一个相当广泛的问题,并且肯定会引出一些基于意见的回应。也就是说,您可以依赖的一件事是服务(和工厂)是单身人士。这意味着如果您需要在控制器之间共享数据,或者在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"将允许我们设置值,只要页面未被更改,就可以检索这些值。我将an example放在一起,显示了两个控制器 here 之间的共享数据。如果控制器位于不同的视图上,这种模式也可以正常工作。

再次 - 我不确定这是否是推荐的模式,但它是我见过的并且效果很好。祝你好运!


注意 - 您的问题中引用了此答案 - 因此它可能并不完全符合您的要求。也就是说,我发布的其他人可能需要一种简单的方法来保存SPA的状态。

答案 1 :(得分:0)

如果您将共享状态放入服务中,只需向它添加一个reset()函数,当它们转到" A"步骤或他们完成该过程。

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