我正在尝试编写一个函数来创建一个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
发出cancel
或value
事件。这是相应的代码片段:
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
个事件。