4

我有一个带有两个视图的简单 SPA:一个列表视图和一个详细视图。我使用一个名为 StateService 的服务在两个控制器之间传递数据。

我正在尝试处理用户刷新浏览器页面的情况——当这种情况发生时,StateService 会重新初始化,并且详细视图无法再工作。我想检测何时发生这种情况并将用户返回到列表视图。

这是我的状态服务的简化版本。我的想法是,当我切换到详细视图时,我会将 isInitialized 设置为 true,以便我可以检测到服务何时未正确初始化。

var StateService = function () {
    var isInitialized = false;
};

这是我在控制器的前几行中尝试过的。StateService 已成功注入控制器。

//always returns [Object], on refresh or navigating from list page
alert(StateService); 
// this next line always returns undefined.  Should be false since I am initializing
// the value to false?
alert(StateService.isInitialized); 
//One of the many combinations I have tried . . .
if (!StateService.isInitialized | StateService.isInitialized == false) {
    $location.path('/');
}

我不知道这是否是我对 javascript 或 angular 理解的差距,但是关于如何让上述代码工作的任何想法,或者关于用户刷新页面时该怎么做的更好想法?

编辑

使用 nycynik 推荐的 console.log 我看到以下内容:

c {} [StateService]
未定义 [StateService.isInitialized]

因此,当此代码被命中时,StateService 本身似乎只是一个空对象。我从另一个控制器(处理列表视图的控制器)得到了相同的结果。

如评论中所述,该服务似乎按预期工作。

4

1 回答 1

1

我认为您的范围界定有问题。javascript 中的变量具有函数作用域。isInitialized 仅适用于您的 StateService 函数,因此您无法在 StateService 函数之外使用它。

不确定你是如何将这个东西放入你的控制器的,但也许这些有帮助:

如果您使用 Angular 的 module.service() 来使用 StateService 作为构造函数将(新 StateService)注入到您的控制器中,那么您需要在实例上设置 isInitialized

var StateService = function () {
   this.isInitialized = false;
};

这样 (new StateService).isInitialized === false

如果您只是使用 module.factory() 或其他不使用 new 的东西,那么您需要将您的 isInitialized 值放在您可以实际使用的其他地方。

var StateService = function () {
};
StateService.isInitialized = false

希望有帮助。

于 2013-07-24T16:41:27.483 回答