在 m() 生成的元素上设置超时事件

Set time out event on a m() generated element

我有一个 m("p.help") 元素,它通过单击事件被删除。

我还希望元素在几秒后如果没有被点击自动删除。我需要为此设定一个超时时间。设置超时无效。

function help() {
  var text = `This is a service template. Use Service section to set the schedule`;

  var node = m("p.help", {
    onclick() {
      this.parentNode.removeChild(this);
    },
  }, text);

  setTimeout(() => {
    if (node.parentNode) {
      node.parentNode.removeChild(node);
      console.log("removed");
      m.redraw();
    }
  }, 5000);

  return node;
}

点击事件正常,但超时无效。它甚至没有被 console.log()

判断触发

我做错了什么?

编辑

感谢 ciscoheat 的提示。

我必须将计时器放入控制器才能正常工作。

所以这个很好用:

function controller(init) {
  this.display = {
    help: true
  };
  setTimeout(() => {
    this.display.help = false;
    m.redraw();
  }, 5000);
}

function view(vm) {
  return m(".container", [
    (() => {
      var text = "Some text";
      if (vm.display.help) {
        return m("p.memo", {
          onclick() {
            this.parentNode.removeChild(this);
          }
        }, text);
      }
    })(),
  ]);
}

要正确使用 Mithril,您应该避免 DOM 操纵,将其留给 Mithril 的快速差异算法。

改为使用状态变量,与显示将在 5 秒后自动更改的帮助段落有关。

这是一个显示我的意思的 jsbin:http://jsbin.com/kixece/edit?html,js,output