使用blessed.js提交文本

时间:2017-12-25 20:59:33

标签: javascript node.js blessed

我正在尝试编写一个函数来创建一个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个事件。

0 个答案:

没有答案