Доколкото разбирам, когато свойствата се използват в обвързващи изрази, техните NOTIFY
сигнали са свързани, за да сигнализират за преоценка на израза всеки път, когато стойността на свойство се промени.
Така че разгледайте този тривиален пример:
Rectangle {
width: 200
height: width - 100
Text {
text: "value is " + (parent.width + parent.height)
}
}
В него свойството height
е обвързано със свойството width
, а свойството text
е обвързано и с двете.
В този пример не е ясно какъв е редът на действие. Искам да кажа, че ако width
се промени, той ще издаде, за да преоцени и двата израза, които го препращат. Но width
също ще промени height
, което също ще задейства оценка на text
.
Следователно свойството text
оценява ли се два пъти? Веднъж, когато width
се промени, и още веднъж, когато width
промени height
? Или може би QML има някакъв механизъм за оптимизиране на това поведение, като например сигналите за уведомяване не задействат действителна преоценка, а само маркират изразите като „мръсни“ и те се преоценяват при следващата итерация на цикъла на събитието, когато цялото сигнализиране е разпространено? И дори да е така, как двигателят ще знае да актуализира height
преди да актуализира text
, за да избегне двойната преоценка на последния? Или може би връзката е директна, а не на опашка, и се използва някакъв по-сложен механизъм, за да се разбере редът на преоценка? Или може би няма нищо подобно и text
може действително да преоцени два пъти, ако случайно това е произволният ред?
Наистина трябва да разбера как работи това, защото имам проект, в който модифицирам множество свойства на множество QML обекти от страна на C++ по императивен начин, които са обвързани от страната на QML и получавам много непоследователно и непостоянно поведение, така че определено трябва да се вземе предвид начина, по който работят.