2017-08-06 16 views
0

現在、私はVueを電子アプリケーション内で使用しています。 Vueのマスターコンポーネント内には複数の子供がいる可能性があります。それぞれの子はそうのように、電子の主要なプロセスで放送されることがあります信号に耳を傾け:Vueコンポーネント内のElectronのipcRendererメッセージのリスニング

export default { 
    ... 
    created() {  
     ipcRenderer.on('set-service-status', (e, data) => { 
      // something with the data 
     }) 
    } 
    ... 
} 

しかし11個の以上の子コンポーネントがある場合、ノードは、エラーMaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 set-service-status listeners added. Use emitter.setMaxListeners() to increase limitをスローします。複数のイベントリスナーが設定されているので、これは意味があります。コンポーネントごとに1つです。

どうすれば解決できますか?私はちょうどマスターコンポーネント内のset-service-status信号を聞いて、次にVueのイベントシステムを使ってメッセージを子どもたちにさらに伝えるべきですか?それとも、これに対処するより良い方法がありますか?

答えて

0

あなたの現在の設定で問題が分かっているように、コンポーネントが作成されるたびにリッスンを開始しています。このため、多くのリスナーが1つのIPCコールに遭遇するという問題が発生します。

created()の代わりにこのロジックをvuex の内部に置き、1回だけ呼び出します。またはメインルートコンポーネントである入力ファイルにはまだcreated()を使用できます。子コンポーネントにデータを小道具として与えることができます。それも動作します。

例えば、

function setupIpc(dispatch) { 
 
    ipcRenderer.on('set-service-status', (e, data) => { 
 
     // something with the data 
 
    }) 
 
    ipcRenderer.on('fullscreenChanged', (e, args) => { 
 
    dispatch('fullscreenHandler', args) 
 
    }) 
 
    ipcRenderer.send('ipcReady') 
 
}

と、アプリケーションを起動したときに一度だけ呼び出して、

updateState({ commit, dispatch }) { 
 
    setupIpc(dispatch) 
 
    setInterval(() => { dispatch('stateSaveImmediate') }, 5000) 
 
    dispatch('init') 
 
    ipcRenderer.once('configGet', (e, data) => { 
 
     if (data === !null || !undefined) { 
 
     commit(ActionTypes.UPDATE_STATE, data) 
 
     } else { 
 
     commit(ActionTypes.UPDATE_STATE_ERROR_NO_CONFIG_FILE) 
 
     } 
 
     dispatch('doSomething') 
 
    }) 
 
    ipcRenderer.send('configGet') 
 
    },

+0

あなたは、私がここに状態マネージャとしてvuex使用していることを想定しています。そうではありません。私は、信号が受信されると、ビジュアルアップデート(ローダーの表示)を実行したいだけです。それにはvuexを導入することが含まれていれば問題ありませんが、少し複雑になります。状態マネージャーに明示的に依存することなくこれを行う簡単な方法はありますか? – Maarten

+0

もう一つの方法を更新しましたが、それはちょっとハッキリしています。ルートコンポーネントを強制的に更新すると、複数の 'ipcRenderer'メッセージが再び始まるからです。 'Devtron'ツールで確認できます - IPCチ​​ャンネル – Necmttn

+0

私は実際にマスターコンポーネントに1つのリスナーを置いていることを考えていましたが、さらに子供たちの下でvueイベントをブロードキャストするようにしました:' Vue。$ root。$ emit( ' set-service-status '、componentId) 'を実行します。 'config-service-status '、(id)=> {//コンポーネントidがブロードキャストされたidと一致するかどうかを確認してから何か}})' – Maarten

関連する問題