2016-04-20 5 views
2
ApplicationWindow { 
    id: root 

    property string rootName: "--rootName" 

    visible: true 
    width: 800 
    height: 400 

    title: qsTr("WatchFace Maker") 

    WatchLcd{ 
     property string watchLcdInApp: "watchLcdInApp" 
     id: watchLcd 
    } 

    TextAdder{ 
     id: textAdder 

     Component.onCompleted: { 
      console.log("APP: ", root.watchLcd.watchLcdInApp)//#Error!!! remove root, it works. 
     } 
    } 
} 

Ich möchte wissen:QML: Kann nicht lesen Eigenschaft ‚xxx‘ undefinierter

  1. Warum funktioniert es nicht, wenn ich root-ID in oben kommentierte Linie?

  2. Wie greift die untergeordnete Komponente auf die Eigenschaft der gleichgeordneten Komponente zu, wenn die untergeordnete Komponente aus einer XXX.qml-Datei erstellt wird?

Antwort

2

Die id Eigenschaft eine „besondere Art“ von Eigentum ist, wird es nur bei „Code Zeit“ aufgelöst und kann nicht während der Laufzeit aufgelöst werden.

root.watchLcd wird nicht funktionieren, weil watchLcd ein id ist, und als solche kann sie nicht mit root.watchLcd

Die id auch logisch funktioniert nur in dieser bestimmten Quelle, und Sie nur, dass bestimmte id müssen unabhängig von der aufgelöst werden Struktur des Objektbaumes, Sie brauchen ihre Eltern nicht id wie in root.watchLcd

Wenn Sie ein bestimmtes Objekt aus einer anderen Datei zugreifen wollen, kann natürlich, dies nicht durch seine id passieren.

//SomeItem.qml 
Item { 
    property alias text : obj.text 
    Item { 
    id: obj 
    property string text 
    } 
    property Item object : obj 
    function getObj() { return obj } 
} 

/main.qml 
Window { 
    visible: true 

    SomeItem { 
    id: item 
    text: "someText" 
    } 

    SomeItem { 
    Component.onCompleted: { 
     //console.log(item.obj.text) // TypeError: Cannot read property 'text' of undefined 
     console.log(item.object.text) // someText 
     console.log(item.getObj().text) // someText 
    } 
    } 
} 

Beachten Sie auch, wie sie die property alias Werke - es in vielen Fällen sinnvoll sein kann, wenn alles, was Sie zugreifen, um ein verschachteltes Objekt Eigentum ist, können Sie es aussetzen: Sie können entweder eine Eigenschaft oder eine Funktion für sie verwenden mit einem Alias, ohne extern auf das Objekt zugreifen zu müssen.