我有一个包含一些事件的 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');
正如您所看到的,当名称更改时,所有注册的回调都会使用新的名称参数进行调用。你如何在 dart 中编写这段代码?谢谢
最佳答案
如果是自定义事件
elem.on['name-changed'].listen((e) {
// handle event
});
如果是 DOM 事件,通常会有特定的 getter,例如
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 事件这样的自定义事件的 getter How do I fire a custom event from 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++}";
});
}
关于javascript - 如何在dart中编写on-*事件/回调注册,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24914605/