如果你看一下this page,它会注意到当对象发生变化时,对var属性的绑定不会自动更新:
Item {
property var car: new Object({wheels: 4})
Text {
text: "The car has " + car.wheels + " wheels";
}
Component.onCompleted: {
car.wheels = 6;
}
}
这会说“汽车有4个车轮”,因为car.wheels = 6;
不会自动触发更新。
页面没有说的是如何解决这个问题?如何手动触发更新(不替换整个car
对象)。
修改:要明确,我不想替换整个car
对象,而我做想要使用{{1} (我的实际属性是一个javascript对象,无法存储在任何本机QML属性类型中)。
编辑2 :以下是使用无法工作的property var
的示例(它说“汽车有0个车轮。”:
QtObject
答案 0 :(得分:2)
实际上,页面 说明如何解决这个问题:
如果onCompleted处理程序改为“car = new Object({wheels:6})” 然后文本将更新为“汽车有6个车轮”,因为 汽车财产本身会发生变化,从而导致变化 发出通知。
虽然我认为这违背了您不要替换整个extension String {
// Build pi function of prefixes
private func build_pi(str: [Character]) -> [Int] {
var n = count(str)
var pi = Array(count: n + 1, repeatedValue: 0)
var k = -1
pi[0] = -1
for (var i = 0; i < n; ++i) {
while (k >= 0 && str[k] != str[i]) {
k = pi[k]
}
pi[i + 1] = ++k
}
return pi
}
// Knuth-Morris Pratt algorithm
func searchPattern(pattern: String) -> [Int] {
// Convert to Character array to index in O(1)
var patt = Array(pattern)
var S = Array(self)
var matches = [Int]()
var n = count(self)
var m = count(pattern)
var k = 0
var pi = build_pi(patt)
for var i = 0; i < n; ++i {
while (k >= 0 && (k == m || patt[k] != S[i])) {
k = pi[k]
}
if ++k == m {
matches.append(i - m + 1)
}
}
return matches
}
}
对象的要求。
话虽如此,还有(至少)另一种选择 - 使用QtObject:
car
鉴于新示例,如果您需要使用包含基本类型的Javascript数组,则您列出的代码不会触发更新。但是,如果您能够使用包含QML类型的Item
{
property var car: QtObject { property int wheels: 4 }
Text {
text: "The car has " + car.wheels + " wheels";
}
Component.onCompleted: {
car.wheels = 6; // This will update the text
}
}
,则可以使用以下解决方法:
list
根据您的需要,这可能很苛刻。无论何时更改数组,创建import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
ApplicationWindow {
id: window
width: 640
height: 480
visible: true
property var car: QtObject { property list<Item> wheels }
Component
{
id: wheelComponent
QtObject
{
property var wheelName;
}
}
Text
{
anchors.fill: parent
text: "The car has " + car.wheels.length + " wheels";
Component.onCompleted:
{
var wheel = wheelComponent.createObject(window, {"wheelName": "Rear-left"} );
car.wheels += wheel;
}
}
}
并更改它的黑客方法都是可取的。
答案 1 :(得分:0)
通知和自动绑定重新评估仅支持QML属性,而不支持JS对象成员。
对于var中的JS对象,只有当实际对象与另一个对象一起更改时才会触发通知,但是当对象在内部发生更改时,通知才会被触发。
然而,您可以通过在内部对象更改后手动发出carChanged()
来强制绑定重新评估。
答案 2 :(得分:-1)
我用这种方式解决了同样的问题:
Item {
property var car: new Object({wheels: 4})
Text {
Connections {
target: car
onWheelsChanged: {
text: "The car has " + car.wheels + " wheels";
}
}
text: "The car has " + car.wheels + " wheels";
}
Component.onCompleted: {
car.wheels = 6;
}
}