Hello Yang,
this isn't about databinding, it's more about states and constraints,
see "http://www.openlaszlo.org/jira/browse/LPP-631".
Here is just another testcase which shows this misbehaviour and probably
a workaround for you..."LzDelegate#disable()":
[code]
<canvas debug="true" >
<class name="resizeview" width="100" height="80"
onmousedown="this.resizer.apply()"
onmouseup="this.resizer.remove()" >
<resizestate name="resizer" apply="false" >
<attribute name="height" value="$once{this.height}" />
</resizestate>
</class>
<class name="testview" width="300" height="220" bgcolor="0xEAEAEA" >
<attribute name="width" value="${this.redview.width+150}" />
<simplelayout axis="y" spacing="20" />
<resizeview name="redview" bgcolor="red" />
</class>
<simplelayout axis="y" spacing="50" />
<testview name="tv1" >
<state apply="true" >
<attribute name="width" value="${this.blueview.width+150}" />
<resizeview name="blueview" bgcolor="blue" />
</state>
<text options="ignorelayout" text="Both resizeviews will affect
width" align="left" valign="bottom" />
</testview>
<button y="230" options="ignorelayout" text="Disable" >
<handler name="onclick" >
tv1.__LZdelegates[0].disable();
</handler>
</button>
<button y="230" x="80" options="ignorelayout" text="Enable" >
<handler name="onclick" >
tv1.__LZdelegates[0].enable();
</handler>
</button>
<testview name="tv2" >
<attribute name="width" value="${this.blueview.width+150}" />
<resizeview name="blueview" bgcolor="blue" />
<text options="ignorelayout" text="Only the blue resizeview will
affect width" align="left" valign="bottom" />
</testview>
</canvas>
[/code]
Cheers,
André
Yang wrote:
In the following, there is a lone button whose width is initially
unset, and then is bound by applying a state. (This is the same as how
the grid's header buttons works.) The width of the button should never
change.
However, if we update the data referenced by the button's datapath,
the button will actually resize.
<canvas>
<dataset name="d">hello world</dataset>
<view width="100" name="v">
<attribute name="doapply" type="boolean" value="$immediately{false}"/>
<button name="b" datapath="d:/text()">
<state apply="${parent.parent.doapply}">
<attribute name="width" value="${parent.width}"/>
</state>
</button>
</view>
<handler name="oninit">
LzTimer.addTimer( new LzDelegate( this, 'changeApply' ), 500 );
LzTimer.addTimer( new LzDelegate( this, 'changeData' ), 1000 );
</handler>
<method name="changeApply">
v.setAttribute('doapply', true);
</method>
<method name="changeData">
d.getPointer().setNodeText('bye');
</method>
</canvas>
Is this a bug? This was the smallest test case I could come up with.
If you just set the state's apply to true, the button never even
expands to width 100.
Furthermore, if you try to add an onwidth handler (such as the
following) to the button in an attempt to correct the width if it ever
gets set to something wrong, the setWidth() seems to just be ignored:
<handler name="onwidth">
if (this.width != parent.width) {
this.setWidth(parent.width);
}
</handler>
The only way I could work around this was to use add another
timer/delegate/method (with timeout 1).
BTW, is there any way to pass an anonymous block of code to a timer
(instead of creating and naming a method)? And is there any way to
pass arguments through a delegate (aside from the
eventSender/eventName)?
Thanks,
Yang
--
Mit freundlichen Grüßen,
André Bargull
Intensis GmbH
Tel.: +49 (0)231 5522-900
Fax.: +49 (0)231 5522-901
E-Mail: [EMAIL PROTECTED]
________________________________
Intensis GmbH
Ruhrallee 9
44139 Dortmund