2017-06-13 4 views
0
node12s内の

私はイベントを発生させるいくつかのオブジェクトを作成するmainを持っています。 これらのうちの1つは、gpioをリスニングするdigitalInputです。ノードj内のマザークラスにイベントを伝播

このようなクラスを見て:私はメインに作成し、それを作成するときに、私はdigitalInputに渡す

class dInput 
{ 
    constructor(port, _id, _name, _messageBus) 
    { 
    this.gpio = new Gpio(port, { 
     mode: Gpio.INPUT, 
     pullUpDown: Gpio.PUD_DOWN, 
     edge: Gpio.EITHER_EDGE 
    }); 

    this.ID = _id; 
    this.Name = _name; 
    this.messageBus = _messageBus; 

    this.gpio.on('interrupt', function(level){ 
     var details = { 
      ID: this.ID, 
      level: level, 
      name: this.Name 
     }; 
     DigitalInputsController.ReportChange(details);   
    }); 

    console.log("created"); 
    } 
} 

messageBus私var messageBus = new events.EventEmitter();

:私は、メインのレベルがある受信

messageBus.on("dInputChanged", function(data){ 
    console.log(data); 
    socket.emit("ButtonStateChanged", data); 
}); 

:GPIOの値が変化するが、一連のイベントが正常に起動したが何

これは私がメインで聞く方法です

{ ID: undefined, level: 0, name: undefined } 

手がかり?イベントハンドラが呼び出された

答えて

2

コンテキスト(this)はEventEmitterインスタンス自体です。

この特定のケースでは、this.gpio'interrupt'イベントハンドラ内では、コンテキストはthis.gpioになります。代わりにdInputインスタンスを参照するには、thisをオーバーライドし、現在のコンテキストに設定します矢印の機能を使用する必要があります次のいずれか

this.gpio.on('interrupt', (level) => { 
    var details = { 
     ID: this.ID, 
     level: level, 
     name: this.Name 
    }; 
    DigitalInputsController.ReportChange(details);   
}); 

か、イベントハンドラの外var self = this;を追加し、self.IDを使用する必要があります、self.Nameなどをイベントハンドラに追加します。

eventHandler.bind()を使用してイベントハンドラ内のthisをオーバーライドすることもできますが、これはノードの最新バージョン(例:v7.0.0 +)での高速操作です。

+0

私はそれをチェックし、報告します、ありがとう! – javirs

+0

完全に機能します!ありがとう! – javirs

関連する問題