2017-02-09 23 views
9

Benzersiz satırlar içeren bir ızgara içeren bir Elektron tabanlı uygulama yapıyorum. Her bir satıra özgü bir içerik menüsü istiyorum. İşte bir örnek: Birden satır olduğunda bu ekran görüntüsü kırpılmışBağlam Menülerinin Elektronda Yığınlandırılması

Image of GUI with context menu

rağmen görebilir ve her satır ayrı veri içerir. Bir satır üzerinde sağ tıklamayı ve benzersiz bir bağlam menüsü almayı tercih ettiğimden, ilk sağ tıklama üzerinde çalışan electron-context-menu'u uyguladım, ancak sonraki sağ tıklamalar bağlam menülerinin istifleme etkisine neden oluyor.

Özellikle, burada olur:

    Birazdan Row-1 ve uygun bağlam menüsünü tıklayın
  1. Birazdan Row-2 tıklayabilir
  2. ortaya çıkar ve Row için bağlam menüsünden bir tekrar -1 gösterir ve sonra Row-2'nin bağlam menüsü açılır. (Ekrandaki uyarı, fare menüsünün üst üste geldiği bağlam menüsüne karşılık gelmiyor)
  3. Bu, kendini tekrar eder. React.JS yılında

, burada electron-context-menu modülü tarafından gerektiği gibi contextmenu nesneyi toplayan benim dinleyici şöyledir:

: this.props.contextMenu(...) perculates kadar React.JS bileşenleri içine beslenecek

handleContextMenu() { 
    this.props.contextMenu({ 
     window: electron.remote.BrowserWindow.getFocusedWindow(), 
     prepend: (params, browserWindow) => [{ 
     label: `Library Compare ${this.state.msn}`, 
     click:() => this.runLibCompare() 
     }], 
     append: (params, browserWindow) => [{ 
     label: '---', 
     }] 
    }) 
    }; 

const contextMenu = eRequire('electron-context-menu'); 

Bazı büyük hata ayıklama işlemleri yaptım ve sorunun bu modül olduğunu düşünmüyorum. Kullandığım modül, esas olarak içerik menüsü ile ilgili bilgileri düzenler ve daha sonra electron.remote işlevlerini ve elektron internetten gelen bir menu.popup işlevini kullanır. İşte specific line in github için bir bağlantı.

const menu = (electron.Menu || electron.remote.Menu).buildFromTemplate(menuTpl); 
menu.popup(electron.remote ? electron.remote.getCurrentWindow() : win); 

menu.popup geçme çağrısı bu line in electron yol açar.

const remoteMemberFunction = function (...args) { 
    if (this && this.constructor === remoteMemberFunction) { 
     // Constructor call. 
     let ret = ipcRenderer.sendSync('ELECTRON_BROWSER_MEMBER_CONSTRUCTOR', metaId, member.name, wrapArgs(args)) 
     return metaToValue(ret) 
    } else { 
     // Call member function. 
     let ret = ipcRenderer.sendSync('ELECTRON_BROWSER_MEMBER_CALL', metaId, member.name, wrapArgs(args)) 
     return metaToValue(ret) 
    } 

}

Yani ipcRender.sendSync için bir çağrı bakınız - Ben ipcMain 'ın receiver of those calls hata ayıklama ifadeleri eklemek Ancak, ben herhangi bir çıktı görmüyorum!

ipcMain.on('ELECTRON_BROWSER_MEMBER_CALL', function (event, id, method, args) { 
    try { 
    args = unwrapArgs(event.sender, args) 
    let obj = objectsRegistry.get(id) 

    if (obj == null) { 
     throwRPCError(`Cannot call function '${method}' on missing remote object ${id}`) 
    } 

    callFunction(event, obj[method], obj, args) 
    } catch (error) { 
    event.returnValue = exceptionToMeta(error) 
    } 
}) 

Yukarıdaki işleve hata ayıklama ifadelerini eklediğimde herhangi bir çıktı görmedim. Ve burası benim aramın duvar olduğu yer.

Elektron 1.4.15 kullanıyorum. Bu sorunun çözülebilir olması gerektiğini biliyorum, tüm atom IDE'leri (elektron tabanlı), çoklu bağlam menülerine sahip olsa da bu konuya sahip değil.

Sanırım bir yer temizlemem gereken bir anı var, sadece önceki içerik menülerinin yığınının nasıl temizleneceğini anlayamıyorum!

cevap

1

Bunu öncelikle e.target kullanarak tıklamanın hedefine ulaşarak çözerim. Sonra, buna bağlı olarak, ilgili contextmenu çağırırım. Hedef isabet uygulamamın hedef listesinde değilse, varsayılan bir içerik kullanırım.

window.addEventListener(
    "contextmenu", 
    e => { 
     e.preventDefault(); 
     if (e.target.id === 'fullscr'){ 

     console.log(e && e.target); 

     // e.preventDefault(); 
     mymenu.popup(remote.getCurrentWindow()); 
     }else{ 
      editmenu.popup(remote.getCurrentWindow()); 
     } 
     console.log(e.which); 
    }, 
    false 
);