繁体   English   中英

如何在Dart中编写On- *事件/回调注册

[英]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');

http://jsfiddle.net/R79Vy/

如您所见,随时更改名称时,都会使用新的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM