2015-05-12 3 views
0

Два абсолютных вопроса для начинающих. У меня есть рабочий код в моем main.js enterState.использование таймера sproutcore MaxInactiveInterval

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. Есть ли пример кода для получения имени пользователя spring в функции _timerFired?

Я видел ответ/решение Мауриц, спасибо, но это слишком сложно для меня.

+0

Хотя вы считаете, что это сложно, это единственный способ, который фактически гарантирует, что все идет так, как вам нужно. Я пришел к решению, которое я вам дал (http://stackoverflow.com/questions/30187236/how-to-deal-with-authenticated-state-in-a-sproutcore-application), потому что любое другое решение создавало слишком много проблем. Потому что: что вы собираетесь делать, если auth действительно потерян, например, из-за потерянного интернет-соединения? – mauritslamers

+0

Thx снова. У нас есть пользователи, как автоматически регистрируется после истечения MaxInactiveInterval. В течение рабочего дня вы хотите войти в систему. Я думал, что таймер и запрос сервера будут делать трюк. – fpk

+0

Я незнаком с grails, но это, скорее всего, собирается сделать трюк. Однако это не учитывает, так как из-за других причин тайм-аут все равно может произойти. В таких случаях вы хотели бы изящно возобновить запущенное приложение, например, путем показа имени входа в самом приложении, затем выполните XHR-апи-вызов, обновив данные, и продолжайте. Вот почему помогает решение для штатов, так как позволяет вам очень сильно контролировать эту ситуацию. – mauritslamers

ответ

0
  1. Этот таймер будет планироваться каждый раз, когда это состояние вводится. Если это корневое состояние приложения, это будет один раз. Если это состояние используется для отображения mainPane, и вы каким-то образом покидаете это состояние и возвращаетесь, то этот таймер будет инициализироваться каждый раз, когда вы вводите это состояние.

  2. Вы можете сохранить имя пользователя как свойство текущего состояния (this._username) и как _timerFired вызывается с этим текущим состоянием (SC.Timer позаботится об этом через цель), у вас будет доступ к Это. Вам, конечно, нужно будет установить это. Другое решение - прочитать его непосредственно с контроллера, который вы используете для процедуры входа в систему.

Тем не менее, это решение подвержено проблемам. Основная причина этого заключается в том, что вы создаете неявные состояния. Я имею в виду, что аутентификация - это состояние приложения, и вместо того, чтобы делать это явным через диаграмму состояний, вы скрываете ее в одном из состояний. Как я писал в комментарии: я пришел к решению, которое я опубликовал в другом вопросе, из-за попытки множества разных решений и проблем. То, что я узнал из этих проблем, состоит в том, что государственный шаблон - ваш друг, и на самом деле попытка работать с ним поможет вам избежать множества головных болей!

+0

Дополнительная информация , мы используем grails и sproutcore вместе. MaxInactiveInterval устанавливается в grails, в sproutcore мы хотим предотвратить автоматический выход из системы. – fpk