使用AngularJS服务和视图处理页面刷新

时间:2013-07-24 12:55:31

标签: javascript angularjs

我有一个包含两个视图的简单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的理解上的差距,但是我对如何使上述代码工作有任何想法,或者更好的想法,当用户刷新页面时该怎么做? / p>

修改

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

  

c {} [StateService]
  undefined [StateService.isInitialized]

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

正如评论中所指出的那样,该服务似乎无法按预期工作。

1 个答案:

答案 0 :(得分:1)

我认为您在确定范围方面存在问题。 javascript中的变量具有函数范围。 isInitialized仅限于您的StateService函数,因此您无法在StateService函数之外获取它。

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

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

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

这种方式(新的StateService).isInitialized === false

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

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

希望有所帮助。