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