sproutcore计时器用法MaxInactiveInterval

时间:2015-05-12 12:55:12

标签: sproutcore

两个绝对的初学者问题。 我在main.js的enterState中有工作代码。

enterState: function(context) {
..
//keepAlive
var now = SC.DateTime.create(); 
if (now.get('hour') < 18){
    SC.info ("main_state:enterState:go %@", now.get('hour'));
    this.timer = SC.Timer.schedule({
         target: this,
         action: '_timerFired',
         interval: 5000, 
         repeats: YES
        });
    } else {
        SC.info ("MainState:enterState:nogo %@", now.get('hour'));
        };
..
    this.mainPane.append();
    },

_timerFired: function(){
        SC.info ("_timerFired %@", Date.now());
    },


exitState: function() {
        SC.info('main_state:exitState');
        this.timer.invalidate();
        this.mainPane.remove();             
    },

问题1:每次用户进入主视图时,是否使用enterState,是否初始化一次或每次用户切换视图时定时器计划?

问题2:我想我需要一个查询。 e.q.登录的用户名,以防止由于会话MaxInactiveInterval过期而自动注销。是否有示例代码来获取_timerFired函数中的spring用户名?

我看到了Maurits的答案/解决方案,谢谢,但这对我来说太复杂了。

1 个答案:

答案 0 :(得分:0)

  1. 每次输入此状态时,都会安排此计时器。如果这是应用程序的根状态,那将是一次。如果此状态用于显示mainPane并且您以某种方式离开此状态并返回,则每次进入此状态时都将初始化此计时器。

  2. 您可以将用户名保留为当前状态(this._username)的属性,并且调用_timerFired,这是当前状态(SC.Timer将通过目标处理),您将有权访问它。当然,你需要以某种方式设置它。另一种解决方案是直接从用于登录过程的控制器中读取它。

  3. 然而,这种解决方案很容易出问题。这样做的主要原因是您正在创建隐式状态。我的意思是,经过身份验证的是一个应用程序状态,而不是通过状态图表将其显式化,而是将其隐藏在其中一个状态中。正如我在评论中写道的那样:由于尝试了许多不同的解决方案并遇到麻烦,我找到了我在另一个问题中发布的解决方案。我从这些问题中学到的是状态图是你的朋友,真正尝试使用它可以帮助你避免一大堆头痛!