Griffon 绑定不起作用
Griffon binding not working
我正在使用 Griffon 1.5 .. 在一个视图中,我有一个定义为 ..
的面板
panel(background: bind { model.background },
visible: bind { model.stillageComplete },
constraints: 'grow,wrap') {
migLayout(layoutConstraints:'fill')
label(text: bind{model.stateText}, constraints:'align center', foreground: bind{model.foreground},
font: new Font("Sans Serif", Font.BOLD, 20))
}
在我的模型中..
@Bindable
@PropertyListener(stillageCompleteCheck)
boolean toggle
@Bindable
stillageComplete = false
@Bindable
stateText
.. 以及其他字段和 属性 侦听器方法 ..
private stillageCompleteCheck = { evt ->
def contentsChecked = checkContents()
stillageComplete =
(currentContentCount == stillageSize && !(statusList.find { it != Color.green })
println "StillageComplete ? ${stillageComplete} ${currentContentCount} ${stillageSize}"
println "StateText ? ${stateText}"
}
我在控制器方法中设置了 model.toggle 变量,该方法运行 属性Listener 代码并正确设置了参数,但面板未显示。任何人都可以看到我的代码有问题吗?
顺便说一句..我有另一个面板,如下所示,可以正常工作..
panel(background: Color.yellow,
visible: bind { model.stillageOverdue },
constraints: 'grow,wrap') {
migLayout(layoutConstraints: 'fill')
label("Finish Time Overdue", constraints: 'align center', foreground: Color.red,
font: new Font("Sans Serif", Font.BOLD, 20))
}
我认为问题出在下面一行
stillageComplete = (currentContentCount == stillageSize && !(statusList.find { it != Color.green })
这是一个典型的 Groovy 陷阱。从外面(model.stillageComplete = true
)看起来是字段访问,实际上是model.setStillageComplete(true)
,换句话说,这实际上是属性访问。但是当从包含 "property" 的实例中调用相同的代码时,这条规则被推翻了,有效的字段访问胜出。所以发生的结果是 属性 stillageComplete
的预期 PropertyChangeEvent 没有被触发。
解决方法很简单,明确调用 setter 或自己触发 PCE。调用 setter 更容易。
setStllageComplete((currentContentCount == stillageSize && !(statusList.find { it != Color.green }))
我正在使用 Griffon 1.5 .. 在一个视图中,我有一个定义为 ..
的面板panel(background: bind { model.background },
visible: bind { model.stillageComplete },
constraints: 'grow,wrap') {
migLayout(layoutConstraints:'fill')
label(text: bind{model.stateText}, constraints:'align center', foreground: bind{model.foreground},
font: new Font("Sans Serif", Font.BOLD, 20))
}
在我的模型中..
@Bindable
@PropertyListener(stillageCompleteCheck)
boolean toggle
@Bindable
stillageComplete = false
@Bindable
stateText
.. 以及其他字段和 属性 侦听器方法 ..
private stillageCompleteCheck = { evt ->
def contentsChecked = checkContents()
stillageComplete =
(currentContentCount == stillageSize && !(statusList.find { it != Color.green })
println "StillageComplete ? ${stillageComplete} ${currentContentCount} ${stillageSize}"
println "StateText ? ${stateText}"
}
我在控制器方法中设置了 model.toggle 变量,该方法运行 属性Listener 代码并正确设置了参数,但面板未显示。任何人都可以看到我的代码有问题吗?
顺便说一句..我有另一个面板,如下所示,可以正常工作..
panel(background: Color.yellow,
visible: bind { model.stillageOverdue },
constraints: 'grow,wrap') {
migLayout(layoutConstraints: 'fill')
label("Finish Time Overdue", constraints: 'align center', foreground: Color.red,
font: new Font("Sans Serif", Font.BOLD, 20))
}
我认为问题出在下面一行
stillageComplete = (currentContentCount == stillageSize && !(statusList.find { it != Color.green })
这是一个典型的 Groovy 陷阱。从外面(model.stillageComplete = true
)看起来是字段访问,实际上是model.setStillageComplete(true)
,换句话说,这实际上是属性访问。但是当从包含 "property" 的实例中调用相同的代码时,这条规则被推翻了,有效的字段访问胜出。所以发生的结果是 属性 stillageComplete
的预期 PropertyChangeEvent 没有被触发。
解决方法很简单,明确调用 setter 或自己触发 PCE。调用 setter 更容易。
setStllageComplete((currentContentCount == stillageSize && !(statusList.find { it != Color.green }))