2017-09-04 1 views
0

blessed-contrib tree module의 함수를 재정의하려고합니다. 그러나 개체 상속의 방법으로 뭔가를 놓치고 생각합니다. 어떤 도움이 될 것이라고 생각합니다. 크게 감사어떻게 자바 스크립트 라이브러리 개체를 재정의 this.function (arg, function() {

원래 코드 :.. 나는 내 자신의 코드에 this.rows.key(options.keys, function() { 함수를 재정의하기 위해 노력하고있어

function Tree(options) { 
//... 
    this.rows = blessed.list({ 
    top: 1, 
    width: 0, 
    left: 1, 
    style: options.style, 
    padding: options.padding, 
    keys: true, 
    tags: options.tags, 
    input: options.input, 
    vi: options.vi, 
    ignoreKeys: options.ignoreKeys, 
    scrollable: options.scrollable, 
    mouse: options.mouse, 
    selectedBg: 'blue', 
    }); 

    this.append(this.rows); 

    this.rows.key(options.keys, function() { 
    var selectedNode = self.nodeLines[this.getItemIndex(this.selected)]; 
    if (selectedNode.children) { 
     selectedNode.extended = !selectedNode.extended; 
     self.setData(self.data); 
     self.screen.render(); 
    } 

    self.emit('select', selectedNode, this.getItemIndex(this.selected)); 
    }); 

//... 

나는 다음과 같은 일을 할 노력하고있어하지만 난 잘 모르겠어요 어떻게 객체 path는 궁극적으로 축복받은 contrib.tree.list 유형의 경우 작동합니다.

내 코드는 다음과 같은 :

"use strict"; 
var blessed = require('blessed'), 
    contrib = require('blessed-contrib'); 

//... 

//create layout and widgets 
var grid = new contrib.grid({rows: 1, cols: 2, screen: screen}) 

var tree = grid.set(0, 0, 1, 1, contrib.tree, 
    { 
     style: { 
     text: "red", fg: 'blue', 
     selected: { 
      bg: 'yellow', fg: 'white' 
     } 
    }, 
     // keys: ['+', 'space'], 
     vi: true, 
     template: { lines: true }, 
     label: 'Filesystem Tree' 
    }) 

// monkeypatch contrib.tree.rows.key(options.keys, function() {} 

// save the original 
var old_tree_rows_key = tree.rows.key; 

//tree.rows.key = function(options_keys) { 
tree.rows.key = function(options_keys) { 
    var selectedNode = self.nodeLines[this.getItemIndex(this.selected)]; 

    // handle items in options.keys array on my own for custom purposes 
    // ... 

    // Code I want commented out: 
    // if (selectedNode.children) { 
    // selectedNode.extended = !selectedNode.extended; 
    // self.setData(self.data); 
    // self.screen.render(); 
    // } 

    self.emit('select', selectedNode, this.getItemIndex(this.selected)); 
    }; 

//... 
+0

당신이'덮어 tree.rows.key', 오히려'Tree' 생성자를 덮어'이를 호출하는 것을 방지하지 않으려는 것 같아 .rows.key'를 특정 콜백 함수와 함께 사용합니다. – Bergi

+0

답장을 보내 주셔서 감사합니다. 나는 네가 옳다고 생각한다. 나는 지금 당신이 묘사 한 방식으로 갈 방법을 연구 중입니다. 나는 훨씬 더 가까워졌습니다. –

답변

1

좋아, 감사 @Bergi을! 그의 단서는 나를 javascript - Why is it impossible to change constructor function from prototype?로 인도했다. 나는 객체에 더 깊이 접근해야한다고 생각하고 있었고 전체 생성자를 복사 할 필요가 없다고 생각했지만 잘못된 것이 었습니다.

내 마지막 코드는 다음과 같습니다

"use strict"; 

var blessed = require('blessed'), 
    contrib = require('blessed-contrib'), 
    Node = blessed.Node, 
    Box = blessed.Box; 

//... 

// monkeypatch contrib.tree constructor to change keyhandler 

// save the original 
var old_tree = contrib.tree.prototype; 

//function Tree(options) { 
contrib.tree = function(options) { 

    if (!(this instanceof Node)) return new contrib.tree(options); 

    var self = this; 
    options = options || {}; 
    options.bold = true; 
    this.options = options; 
    this.data = {}; 
    this.nodeLines = []; 
    this.lineNbr = 0; 
    Box.call(this, options); 

//... 

    this.rows.key(options.keys, function() { 
    var selectedNode = self.nodeLines[this.getItemIndex(this.selected)]; 
    // if (selectedNode.children) { 
    // selectedNode.extended = !selectedNode.extended; 
    // self.setData(self.data); 
    // self.screen.render(); 
    // } 

    self.emit('select', selectedNode, this.getItemIndex(this.selected)); 
    }); 
//... 
}; 

// restore binding 
contrib.tree.prototype = old_tree; 

var tree = grid.set(0, 0, 1, 1, contrib.tree, 
    { 
     style: { 
     text: "red", fg: 'blue', 
     selected: { 
      bg: 'yellow', fg: 'white' 
     } 
    }, 
     // keys: ['+', 'space'], 
     vi: true, 
     template: { lines: true }, 
     label: 'Filesystem Tree' 
    }) 
//... 
관련 문제