2016-07-12 13 views
1

Ich möchte eine JS-Bibliothek nehmen, die für Node.js entworfen und verpackt wurde und sie mit QML verwenden (speziell die ProtoBuf library). Die ProtoBuf-Bibliothek basiert auf der ByteBuffer library.Verwenden einer Node JS-Bibliothek mit QML

Ich bearbeitet bytebuffer.js und protobuf.js, um .pragma library als erste Zeile hinzuzufügen. Dann in meinem .qml ich habe:

import "qrc:/scripts/bytebuffer.js" as BB 
import "qrc:/scripts/protobuf.js" as PB 

Window { 
    Component.onCompleted: { 
    console.log('PB', PB); 
    console.log('func',PB.loadProtoFile); 
    for (var k in PB) console.log(k,typeof PB[k],PB[k]); 
    console.log('done!') 
    } 
} 

Der Ausgang ich sehe, ist:

qml: PB [object Object] 
qml: func undefined 
qml: done! 

So wird QML Laden der protobuf Bibliothek in gewissem Sinne (und ich habe in dieser Bibliothek Debug-Nachrichten setzen und bestätigt, dass die generic loader läuft und ByteBuffer finden kann, aber es ist kein Objekt mit der methods that I expect, wie loadProtoFile().

Wie komme ich an das ~ real ProtoBuf Objekt, das die Bibliothek aussetzt? Oder wie soll ich die Bibliotheken ändern, um mit QML richtig zu arbeiten?

Antwort

2

Ich verstehe jetzt, dass die Art und Weise QML Bibliotheken Namespaces, die Aussage

import "qrc:/scripts/protobuf.js" as PB 

verursacht PB die globale Reichweite sein, in dem die Bibliothek Skript ausgeführt wurde. Als solche protobuf die 'echte', dass die Bibliothek in diesem Code aussetzt:

var ProtoBuf = PB.dcodeIO.ProtoBuf; 
console.log(ProtoBuf.loadProtoFile); 
//-> function() { [code] } 
:

(global["dcodeIO"] = global["dcodeIO"] || {})["ProtoBuf"] = factory(global["dcodeIO"]["ByteBuffer"]); 

in QML wie finden