2013-07-24 20 views
4

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

我想处理用户刷新浏览器页面的情况 - 当发生这种情况时,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或角度的理解有差距,但我如何能得到上面的代码的任何想法工作,或做什么更好的想法,当用户刷新这一页?

编辑

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

13 C {} [的StateService]
未定义[StateService.isInitialized]

所以看起来StateService本身只是一个空的对象,当这段代码被击中时。我从其他控制器(处理列表视图的控制器)获得相同的结果。

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

+0

我对你的StateService有点困惑,不应该将它与AngularJS的服务或工厂函数一起创建为真正的AngularJS服务。 看来你的StateService并不是真正的AngularJS服务,因此不能正确初始化... – DanEEStar

+0

服务本身只是一个函数,并通过app.service()绑定到模块/应用程序。我正在这样做,但我没有在这里显示这些代码。该服务在其他方面功能完全正常 - 这就是我正在努力解决的问题中所描述的问题。 –

+0

你能告诉你的网址,并在创建时相应地填充服务吗? – akonsu

回答

1

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

不知道你究竟是如何得到这个东西到你的控制器,但也许这些帮助:如果您使用的是角度的module.service()使用的StateService作为构造注入(新

的StateService)到您的控制器,那么你需要设置将IsInitialized实例上的

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

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

如果你只是使用module.factory()或别的东西,那不使用新的,那么你就是d把你的isInitialized值放在别的地方,你实际上可以得到它。

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

希望有所帮助。

+0

啊哈!关于javascript如何工作的非常简单的误解。谢谢你的帮助。 –