想要向较旧的 AngularDart(v1.24.0 SDK)Web 应用程序添加会话空闲超时

Want to add a session idle timeout to an older AngularDart (v1.24.0 SDK) web application

我在 2016 年创建了一个 AngularDart 应用程序,它使用下面列出的依赖项。我的客户想向应用程序添加会话空闲超时,但我不知道如何开始。该应用程序是 4 年前创建的并且不在当前版本上,这无济于事。关于哪些 dart 或 angulardart 库可能包含支持此需求的组件有什么建议吗?

environment:
  sdk: '>=1.24.0 <2.0.0'

dependencies:
  angular: ^4.0.0+2
  angular_router: ^1.0.2
  angular_components: ^0.6.0
  json_object: any
  http: "^0.11.3+14"
  angular_dart_ui_bootstrap: '>=0.0.1'
  ng_bootstrap: ^0.9.2
  dartson: "^0.2.7"
  browser_detect: "^1.0.4"
  archive: "^1.0.33"
  build: "^0.11.0"
  intl: "^0.15.6"

dev_dependencies:
  browser: ^0.10.0
  dart_to_js_script_rewriter: ^1.0.1
  test: ^0.12.0
  angular_test: ^1.0.0

transformers:
- dartson
- angular:
    entry_points:
      - web/main.dart
      - test/**_test.dart
- test/pub_serve:
    $include: test/**_test.dart
- dart_to_js_script_rewriter

# Uncomment the following in sdk 1.24+ to make pub serve
# use dartdevc (webdev.dartlang.org/tools/dartdevc).
#web:
#  compiler:
#    debug: dartdevc

编辑: 我试图通过在页面上添加计时器和捕获用户交互来创建解决方案。

在我的 app_component.dart 中,我在 init 函数中添加了事件侦听器。我创建了一个计时器并将其超时设置为一分钟以进行测试。

有一个开始事件侦听器,它在调用时创建计时器。用户登录成功后第一次调用。

有一个取消事件计时器,取消计时器,将其清空,如果用户仍然登录,则重新创建计时器。这由用户 activity(按键或鼠标移动)或注销调用。如果调用时用户仍处于登录状态,则取消计时器,设置为空,然后重新创建。如果用户注销,则不会重新创建。

这段代码的重点是在用户登录时启动计时器,每当用户与应用程序交互(按键或鼠标移动)时重新启动它,并在用户注销时关闭它。

它的目的是如果没有用户 activity 1 分钟,然后 handleTimerEvent 将被调用。这接近于我有意外行为的工作。

      Future<Null> ngOnInit() async {

        _eventService.onStartIdleTimer.stream.listen((timerEvent) {
          if(idleTimer == null) {
            print(
                "Starting idleTimer: " + new DateTime.now().toLocal().toString());
            idleTimerStarted = new DateTime.now();
            idleTimer = new Timer(new Duration(minutes: 1), handleTimerEvent());
          }
        });

        _eventService.onCancelIdleTimer.stream.listen((timerEvent){
          if(idleTimer != null) {
            if (idleTimer.isActive) {
              print(
                  "Canceling idleTimer: " +
                      new DateTime.now().toLocal().toString());
              var diff = new DateTime.now().difference(idleTimerStarted);
              print(diff.inSeconds.toString() +" seconds elapsed.");

              idleTimer.cancel();
              idleTimer = null;
              if (isLoggedIn)
                _eventService.onStartIdleTimer.add(new IdleTimerEvent("Start"));
            }
          }
        });
  }

  handleTimerEvent(){
    print("In handleTimerEvent!");
    if(this.isLoggedIn){
      if(new DateTime.now().difference(idleTimerStarted).inMinutes > 1){
        print("Idle Timer passed configured limit.  Logging user out.");
        logoutForIdle();
      } else {
        _eventService.onStartIdleTimer.add(new IdleTimerEvent("Start"));
      }
    }
  }

  logoutForIdle() {
    _eventService.onError.add(new GenomicsErrorEvent()
      ..message = globals.idleTimeoutMessage
      ..dismissable = true
      ..alertType = alertType);

    logout();

    _eventService.onCancelIdleTimer.add(new IdleTimerEvent("Cancel"));
  }

首先,当我调用Timer.cancel() 时,回调似乎正在触发,这是出乎意料的。当我等待超时时,我得到这个异常:

EXCEPTION: NullError: method not found: 'call[=12=]' on null
STACKTRACE: 
TypeError: Cannot read property 'call[=12=]' of null
    at StaticClosure.dart._rootRun (http://localhost:63114/main.dart.js:7427:18)
    at _ZoneDelegate.run (http://localhost:63114/main.dart.js:10632:41)
    at NgZone.dart.NgZone._run (http://localhost:63114/main.dart.js:112512:24)
    at Object.eval (eval at Closure_forwardCallTo (http://localhost:63114/main.dart.js:4663:14), <anonymous>:3:45)
    at _CustomZone.run (http://localhost:63114/main.dart.js:10765:41)
    at _CustomZone.runGuarded (http://localhost:63114/main.dart.js:10681:21)
    at _CustomZone_bindCallback_closure.dart._CustomZone_bindCallback_closure.call[=12=] (http://localhost:63114/main.dart.js:10836:27)
    at NgZone__createTimer_closure.dart.NgZone__createTimer_closure.call[=12=] (http://localhost:63114/main.dart.js:112664:19)
    at StaticClosure.dart._rootRun (http://localhost:63114/main.dart.js:7432:16)
    at _ZoneDelegate.run (http://localhost:63114/main.dart.js:10632:41)
ORIGINAL EXCEPTION: NullError: method not found: 'call[=12=]' on null

我很迷茫

解决
idleTimer = new Timer(new Duration(minutes: 1), handleTimerEvent());

应该是

idleTimer = new Timer(new Duration(minutes: 1), handleTimerEvent);

您编写的代码是 在创建计时器时调用 handleTimerEvent,并传递 null(来自 [ 的隐式 return 值=14=]) 作为定时器的回调。您正在调用它而不是将其作为回调传递,这就是为什么它是 运行。当计时器触发时,它会尝试将 null 作为函数调用,这是您看到的异常。目前尚不清楚为什么取消不起作用 - 也许事情 运行 顺序错误,您正试图在启动计时器之前取消。