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

我正在尝试处理用户刷新浏览器页面的情况-发生这种情况时,StateService被重新初始化,并且详细 View 不再起作用。我想检测何时发生这种情况,并将用户返回到列表 View 。

这是我的国家服务的简化版本。这个想法是,当我切换到详细信息 View 时,我会将isInitialized设置为true,以便可以检测到何时未正确初始化服务。

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

这就是我在 Controller 的前几行中尝试过的方法。 StateService已成功注入(inject) Controller 。
//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,我看到以下内容:



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

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

最佳答案

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

不确定到底是如何将其放入 Controller 中的,但是可能有以下帮助:

如果您使用 Angular module.service()将StateService用作构造函数,以将(新的StateService)注入(inject)到 Controller 中,则需要在实例上设置isInitialized

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

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

如果您仅使用module.factory()或其他不使用new的东西,则需要将isInitialized值放在其他您可以实际使用的值上。
var StateService = function () {
};
StateService.isInitialized = false

希望能有所帮助。

07-26 02:35