想要向较旧的 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
作为函数调用,这是您看到的异常。目前尚不清楚为什么取消不起作用 - 也许事情 运行 顺序错误,您正试图在启动计时器之前取消。
我在 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
作为函数调用,这是您看到的异常。目前尚不清楚为什么取消不起作用 - 也许事情 运行 顺序错误,您正试图在启动计时器之前取消。