As you want ro achieve a simple direct binding, you could try changing
zone = component.createObject(layout, {
"x": zoneMapper.x,
"y": zoneMapper.getY()+30,[...]
into
zone = component.createObject(layout, {
"x": Qt.binding(function() { return zoneMapper.x })
"y": Qt.binding(function() { return zoneMapper.getY()+30}),[...]
Does this work as expected?