0

我正在尝试编写一个函数,该函数将创建一个textarea元素来读取字符串并在完成后删除该元素。这就是我最终得到的结果:

function getText() {
  let input = blessed.textarea({
    parent: screen,
    top: 'center',
    left: 'center',
    width: '50%',
    height: '25%',
    border: {
      type: 'line'
    },
    inputOnFocus: true,
    style: {
      border: {
        fg: 'default'
      }
    }
  });
  input.key(['enter'], () => input.submit());
  input.key(['escape'], () => input.cancel());
  input.on('submit', () => {
    let text = input.getValue();
    input.destroy();
    // process the text... 
    debug('done!');
  });
  input.on('cancel', () => {
    input.destroy();
    debug('cancelled');
  });
  input.focus();
}

但是,每当我按“输入”时,它都会取消输入而不是提交它。我试过调试代码,我发现虽然为关键事件调用了正确的处理程序,但cancel之后调用了一个处理程序。谁能告诉我我到底做错了什么?

编辑

在查看了源代码后,textarea我发现submit()cancel()方法基本上做同样的事情:

Textarea.prototype.submit = function() {
  if (!this.__listener) return;
  return this.__listener('\x1b', { name: 'escape' });
};

Textarea.prototype.cancel = function() {
  if (!this.__listener) return;
  return this.__listener('\x1b', { name: 'escape' });
};

由于事先进行了网络共享,因此__listener()实际上调用此处。_listener由于key.name等于'escape',因此在方法内部会调用done(null, null)。在done()其他操作中,我们根据调用的第二个参数发出submit或事件。这是相应的代码片段:cancelvalue

if (err) {
  self.emit('error', err);
} else if (value != null) {
  self.emit('submit', value);
} else {
  self.emit('cancel', value);
}
self.emit('action', value);

我可能会遗漏一些东西,但如果没有,这意味着元素的submit()cancel()方法实际上都会发出一个cancel事件。

4

0 回答 0