[英]How to write on-* event/callback registration in dart
我有一个包含一些事件的JavaScript类,需要将其重写为Dart。 我不知道如何在使用回调的地方重写部分。 这是我的示例代码:
var Person = function (name) {
this.name = name;
this.onNameChangedCallbacks = [];
}
Person.prototype.onNameChanged = function(callback) {
this.onNameChangedCallbacks.push(callback);
}
Person.prototype.setName = function (name) {
this.name = name;
this.onNameChangedCallbacks.forEach(function (callback){
callback(name);
});
}
var adam = new Person('Adam');
adam.onNameChanged(function(newName) {
alert('New name is set to: ' + newName);
});
adam.setName('eva');
如您所见,随时更改名称时,都会使用新的name参数调用所有已注册的回调。 您如何用dart编写此代码? 谢谢
如果是自定义事件
elem.on['name-changed'].listen((e) {
// handle event
});
如果是DOM事件,通常会有特定的获取方法,例如
elem.onNameChanged.listen((e) {
// handle event
});
// or
elem.onNameChanged.listen((e) => /* handle event (inline function body) */);
您也可以通过一种方法
elem.onNameChanged.listen(nameChangeHandler);
void nameChangeHandler(e) {
// handle event
}
当您想明确地退订(不依赖垃圾回收)时
import 'dart:async';
StreamSubscription nameChangeSubscr;
nameChangeSubscr = elem.onnameChanged.listen((e) => /* handle event */);
// unsubscribe
if(nameChangeSubscr != null) nameChangeSubscr.cancel();
如果您想让自定义事件(如DOM事件)获取, 请问如何从Polymer Dart触发自定义事件?
也许这就是你想要的
import 'dart:async';
class Person {
Stream onNameChange;
//StreamController _controller = new StreamController();
StreamController _controller = new StreamController.broadcast();
Person() {
onNameChange = _controller.stream;
}
String _name;
String get name => _name;
set name(String val) {
_name = val;
_controller.add(val);
}
}
void main() {
var p = new Person();
StreamSubscriptions nameChangeSubscr = p.onNameChange.listen((e) => print('name changed: $e'));
var i = 0;
new Timer.periodic(new Duration(milliseconds: 300), (Timer t) {
if(i > 5) {
t.cancel();
if(nameChangeSubscr != 0) nameChangeSubscr.cancel();
}
p.name = "name ${i++}";
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.