如果你看一下this page,它会注意到当对象发生变化时,对var属性的绑定不会自动更新:
Item {
property var car: new Object({wheels: 4})
Text {
text: "The car has " + car.wheels + " wheels";
}
Component.onCompleted: {
car.wheels = 6;
}
}
这将说"The car has 4 wheels"因为 car.wheels = 6;
不会自动触发更新 .
页面没有说的是如何解决这个问题?如何手动触发更新(不替换整个 car
对象) .
Edit: 要清楚,我不想替换整个 car
对象,我确实想要使用 property var
(我的实际属性是一个无法存储在任何本机QML属性类型中的javascript对象) .
Edit 2: 这是一个使用 QtObject
的例子不起作用(它说"The car has 0 wheels.":
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
ApplicationWindow {
width: 640
height: 480
visible: true
property var car: QtObject { property var wheels: [] }
Item {
Text {
text: "The car has " + car.wheels.length + " wheels";
}
Component.onCompleted: {
car.wheels.push("Rear-left");
car.wheels.push("Rear-right");
car.wheels.push("Front-left");
car.wheels.push("Front-right");
}
}
}
3 回答
实际上,该页面确实说明了如何解决这个问题:
虽然我认为这违背了你不要更换整个
car
对象的要求 .话虽如此,还有(至少)另一种选择 - 使用QtObject:
编辑
给定新示例,如果您需要使用包含基本类型的Javascript数组,则会触发更新的代码 . 但是,如果您能够使用包含QML类型的
list
,则可以使用以下解决方法:根据您的需要,这可能是苛刻的 . 创建
property bool update
并在更改阵列时更改它的黑客方法可能更好 .通知和自动绑定重新评估仅支持QML属性,而不支持JS对象成员 .
对于var中的JS对象,仅当实际对象随另一个对象更改时才会触发通知,但是当对象在内部更改时则不会触发通知 .
但是,您可以通过在进行内部对象更改后手动发出
carChanged()
来强制绑定重新评估 .我用这种方式解决了同样的问题: