0

我正在用祝福(JS 版本)编写一个简单的任务管理器。我使用一个list小部件来显示我当前的任务。我可以使用 选择项目enter,但是我想对“悬停”项目使用不同的命令,例如,将鼠标悬停在项目上并按下d以删除任务,或c将其标记为已完成。

但是,从文档中我找不到如何做到这一点。该selected事件只听enter键,list.key()不知道谁是列表中的“悬停”项目。

一个简单的例子:

const blessed = require('blessed');
const screen = blessed.screen({smartCSR: true});

const taskList = blessed.list({keys: true, items: ['a', 'b', 'c']});

taskList.on('selected', () => { console.log('got an enter'); });
taskList.key('d', () => { console.log('got an a'); });

有没有办法在按下键时获取列表中的选定项目,或者将键附加到“选定”事件,然后使用开关来发现按下了哪个键?

4

1 回答 1

0

为了访问选定的项目,您可以在回调中使用常规而不是箭头函数,以便访问“this”,即 taskList

taskList.on('select', function(item, selected) { 
  console.log('got enter/select event', selected, item.content); 
  // this.selected and this.items[this.selected].content also available here
});
    
taskList.key('a', function() { 
  console.log('got "a"', this.selected, this.items[this.selected].content); 
});

taskList.key('b', function() { 
  console.log('got "b"', this.selected, this.items[this.selected].content); 
});

注意:列表组件应使用 指定parent: screen,以便捕获关键事件,请参阅github issue

完整样本

const blessed = require('blessed');
const screen = blessed.screen({smartCSR: true});

screen.key(['escape', 'q', 'C-c'], function() { screen.destroy(); process.exit(0); });

const taskList = blessed.list({
  parent: screen, // Can't capture events if we use screen.append(taskList)
  width: 20,
  keys: true, 
  items: ['a', 'b', 'c'],
  style: {
    selected: { bg: 'blue' },
    item: { fg: 'magenta' }
  }
});

taskList.key(['space', 'o'], function() {
  console.log('got space or "o"');
  this.enterSelected(); // Emit select and action event
});

taskList.on('select', function(item, selected) { 
  console.log(
     'got an enter/select event', 
     'index: ', this.selected, '/' , selected, ';',
     'vaule:', this.items[this.selected].content, '/', item.content
  ); 
});

taskList.key('a', function() { 
  console.log('got an "a"', this.selected, this.items[this.selected].content); 
});

taskList.key('b', function() { 
  console.log('got an "b"', this.selected, this.items[this.selected].content); 
});


screen.render();
于 2022-01-27T06:21:54.480 回答