After the corrected build or binding removal, the view opens normally and the container’s position.y stops feeding its own output back into the expression evaluator. Follow the property-update path: the expression reads component properties, calculates a value, writes that value to the selected component, and triggers another evaluation when a referenced property changes. No controller, switch, address, or port participates in this loop.
Which recovery approach should you choose?
Three recovery paths apply: discard unsaved changes, remove the binding from the view JSON, or upgrade to the build containing the correction. Choose according to whether the affected view can still be edited and whether unsaved work must be preserved.
| Approach | Use when | Preserves unsaved work | Main limitation |
|---|---|---|---|
| Close the view without saving | The runaway binding was added during the current editing session | No | All unsaved changes in that view are lost |
| Remove the binding from the view JSON | The binding dialog times out or the view cannot remain responsive long enough for editing | Potentially, if the current JSON can be copied | A malformed edit can make the view invalid; importing into a new project is the safer variant |
| Upgrade to the corrected build | The system can accept an upgrade and the installed build predates the fix | Yes, subject to normal project recovery | The correction was identified only as the build uploaded on 3/21; the year and software version were not specified |
Upgrade is the preferred permanent action after identifying the corrected release from the product’s official build records. Use JSON removal to recover a trapped view before or during upgrade planning. Closing without saving is the fastest containment measure when the lost work is acceptable.
Why does the position binding become an infinite loop?
The intended layout placed two buttons 10 pixels below a variable-height container:
{../Container.position.y}+{../Container.position.height}+10}
That expression is valid when assigned only to the buttons. It reads the container’s Y position and height, adds the 10-pixel gap, and writes the result to each button’s Y position. The dependency path flows in one direction: container properties to button properties.
Selecting the container along with the buttons changes the graph. The same expression is then assigned to the container’s own Y position. Its new Y value becomes its old Y value plus its height plus 10. Writing the result changes a property that the expression reads, so the evaluator runs again. The loop has no stable value because every pass adds a positive displacement.
| Binding target | Properties read | Property written | Result |
|---|---|---|---|
| Button |
../Container.position.y and ../Container.position.height
|
Button position.y
|
One-way relative positioning |
| Container itself | Its own position.y and position.height
|
Its own position.y
|
Self-referential reevaluation |
In the reported failure, the coordinate passed 20 million pixels within seconds. Opening the binding window then produced a timeout, and pasting another binding over the affected component did not remove the loop.
Where should diagnosis start?
Layer one first means identifying the first changing value, not beginning with application-level symptoms. Here the physical and network path is healthy enough to display the designer; the fault begins inside the view’s property graph. Trace the binding from its destination back through every referenced property.
- Identify every component selected when the position binding was created. Multi-selection is the entry point for this failure.
- Inspect the destination property on each selected component. The hazardous target is the container’s own
position.y. - Compare the destination with the expression dependencies. A direct read of the destination property creates immediate feedback; an indirect chain through another bound property can create the same class of cycle.
- Observe whether the coordinate changes continuously without an operator, data, or layout input. A rapidly increasing value separates a feedback loop from a single incorrect coordinate.
- Stop interacting with the affected view if dialogs begin timing out. Additional editor actions do not break the dependency cycle and may make recovery harder.
Do not spend recovery time checking controller communications, device addresses, or TCP ports. Those hops are outside this update path. The deciding inspection is the relationship between the bound property and the properties referenced by its expression.
How do you contain the runaway update?
If the mistake exists only in the current unsaved edit, close the view without saving. That discards the binding along with every other unsaved change. Reopen the saved copy and confirm that the coordinate remains stationary before recreating the intended layout.
If the work must be preserved, copy the view JSON into a text editor while the designer still permits access. Find the affected container and remove the binding attached to its Y-position property. Remove the complete binding definition, not arbitrary fragments of the expression text, so the remaining JSON structure stays valid.
Create a new view from the corrected JSON rather than overwriting the only working copy. Importing the JSON into a new project provides stronger isolation when the affected project or designer remains unstable. Keep the original text unchanged as a rollback copy until the recovered view has opened and passed validation.
How should the corrected build be applied?
The issue was reported fixed in the build uploaded on 3/21. Because the record supplies neither a year nor a version number, identify that build from the official release history and compare it with the installed software build before upgrading. Do not select a release solely by the month and day.
- Record the installed software version and build identifier from the product’s system information.
- Locate the official release entry whose notes correspond to the
3/21correction forBug-11040. - Back up the project and retain an export of the affected view before changing software.
- Apply the corrected build through the site’s normal upgrade procedure.
- Open a copy of the recovered view before opening or saving the production view.
An upgrade addresses the product defect, but it does not justify retaining a circular layout design. Keep the container out of the target selection and preserve a one-way dependency from the container to the buttons.
How do you verify the repair without recreating the failure?
Test with a copy of the view and vary the data that controls the container height. The container may resize, while both buttons should move to the container’s Y position plus its height plus 10 pixels. The container’s own Y position must remain controlled by its intended static value or non-circular binding.
| Check | Pass condition | Failure indication |
|---|---|---|
| View opening | View and binding editor open without timeout | Editor stalls or reports another timeout |
| Container movement |
position.y remains stationary unless a legitimate input changes it |
Coordinate increases repeatedly without an external change |
| Height response | Container height follows the available options | Height no longer follows its intended binding |
| Button position | Each button stays 10 pixels below the container | Gap drifts or button position remains fixed |
| Selection scope | Only the two buttons own the relative Y-position expression | The container also contains that expression |
Before saving, inspect the binding target list one component at a time. Multi-select editing is efficient, but a parent or reference component accidentally included in the selection can turn a directional layout relationship into a cycle.
Frequently Asked Questions
Why does a Perspective Y-position binding keep increasing?
The bound component is reading its own position.y and writing the calculated result back to that property. With height+10 added on every evaluation, the coordinate cannot settle.
Why does the Perspective binding window time out?
The self-referential expression continuously reevaluates while the editor tries to inspect the same component. In the observed case, the coordinate exceeded 20 million pixels within seconds before the binding dialog timed out.
Why did closing the view remove the infinite loop?
Closing without saving discarded the unsaved binding and restored the last saved view. It also discarded all other unsaved changes in that view.
Why should I recover the view through JSON?
JSON editing bypasses a binding dialog that cannot open. Remove the complete Y-position binding from a copied view definition, then load the corrected JSON into a new view or, more safely, a new project.
How do I verify the Perspective binding fix?
Change the data that controls container height, confirm both buttons remain exactly 10 pixels below it, and perform the final check that the container’s position.y no longer changes by itself.