QML-Komponenten-Scope-Puzzle

8

Nimm diesen Code:

%Vor%

Warum wählt das Gradient seine Eigenschaften fromColor und toColor aus dem einschließenden Element?

Wo ist das dokumentiert (zumindest innerhalb von Quellcode-Kommentaren, besser in den offiziellen Dokumenten)?

Hinweis: Dieses "QML-Verschleierungsbeispiel stammt von Girish Ramakrishnans Vortrag Qt Quick Best Practices und Design Patterns (zurück zur 25. Minute), wo er sagt, dass das Ding extrem kompliziert ist und mit Komponentenumfang und ähnlichem zu tun hat, aber keine Zeit hat, warum zu erklären.

[UPDATE]

Wie MartinJ unten erklärt, hat die oberste Komponente in der Hierarchie element -Eigenschaft (nicht nur element-child) ihre Eigenschaften für alle Eigenschaften sichtbar, jedoch tief geschachtelt, wobei die Eigenschaften dieser Eigenschaften Vorrang haben und Alle Eigenschaften von "Zwischen" -Elementen werden überhaupt nicht angezeigt.

Hier ist ein kleines Beispiel:

%Vor%

Dies ergibt: "ReferenceError: Can't find variable: s"

Und das funktioniert wie erwartet:

%Vor%

, Ausgabe von "parent-str" .

Bitte lesen Sie die Kommentare von MartinJ unten.

    
mlvljr 05.07.2012, 07:33
quelle

2 Antworten

6

Das sieht auf den ersten Blick nicht intuitiv aus, aber geben Sie im Komponentenstammelement fromColor und toColor aus und der Grund wird offensichtlich. Aus den QML-Scope-Dokumenten können Sie entnehmen, dass der Bereich Folgendes umfasst:

  • alle id sind in der Komponente definiert.
  • lokale Eigenschaften
  • die Eigenschaften des Wurzelobjekts der Komponente

A GradientStop {} im obigen Beispiel hat keine lokalen Eigenschaften definiert. Die Root-Komponente tut dies und sie sind die Eigenschaften, für die fromColor und toColor aufgelöst werden müssen. Die Eigenschaften in Gradient {} liegen nicht im Bereich von GradientStop {} .

    
MartinJ 05.07.2012, 23:49
quelle
0

Siehe auch:

%Vor%

Dieser Code gibt aus:

%Vor%

Beachten Sie, dass jedoch (für die Children-Eigenschaft oder nicht) und was auch immer (ein Element oder JavaScript-Code-Snippet) wir binden, die "middle" -Eigenschaft nie gefunden wird.

Der Name lautet also:

  1. id ist innerhalb des Items oder der Komponente definiert (siehe 3)
  2. Lokale Eigenschaften
  3. Eigenschaften der obersten Ebene (oder Komponente, falls sie inline definiert ist, auch wenn der Name "Komponente" weggelassen wird, z. B. wenn Delegaten bequem definiert sind).

Wenn eine Eigenschaft innerhalb der Komponente referenziert wird, aber nicht in ihr definiert ist, kann sie dennoch innerhalb der "customized" -Komponente eingeführt und gesehen werden:

%Vor%

.

%Vor%

Das Ausführen von "OverrideOuter.qml" erzeugt:

%Vor%

Siehe auch Martins Kommentare und die Dokumente, um die Angelegenheit zu klären. Die relevanten Dokumente sind:

mlvljr 06.07.2012 21:30
quelle

Tags und Links