javascript - 如何在dart中编写on-*事件/回调注册

标签 javascript events 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/

正如您所看到的,当名称更改时,所有注册的回调都会使用新的名称参数进行调用。你如何在 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/

相关文章:

javascript - 在 react/redux 中传递多个 props 和 action

javascript - Nanoid 库无法作为事物板资源工作

javascript - jquery 替换 DIV 数据,然后跟踪点击它

javascript - JQuery:如何在不同的元素和不同的 Action 上同时附加相同的委托(delegate)事件

flutter - 在 flutter 中向 App 添加切换按钮/图标

javascript - 使用 REST 服务和 Javascript 存储 token 的 Linkedin 登录

javascript - 可以在 JSON 数组/对象中输入的值的类型是什么?

javascript - 显示具有事件目标的对象的属性

flutter - 初始化时对ListView中的元素进行动画处理

dart - 使用标准库将字符串转换为 Dart 中的 GET 请求参数