3030
3131local function parseExpression (expr , element , propName )
3232 local deps = analyzeDependencies (expr )
33-
33+
3434 if deps .parent and not element .parent then
3535 errorManager .header = " Reactive evaluation error"
3636 errorManager .error (" Expression uses parent but no parent available" )
3737 return function () return nil end
3838 end
39-
39+
4040 expr = expr :gsub (" ^{(.+)}$" , " %1" )
4141
4242 expr = expr :gsub (" ([%w_]+)%$([%w_]+)" , function (obj , prop )
@@ -87,9 +87,34 @@ local function parseExpression(expr, element, propName)
8787 return nil
8888 end
8989 if objName == " self" then
90- return element .get (propName )
90+ -- Check if property exists
91+ if element ._properties [propName ] then
92+ return element .get (propName )
93+ end
94+ if element ._registeredStates and element ._registeredStates [propName ] then
95+ return element :hasState (propName )
96+ end
97+ local states = element .get (" states" )
98+ if states and states [propName ] ~= nil then
99+ return true
100+ end
101+ errorManager .header = " Reactive evaluation error"
102+ errorManager .error (" Property or state '" .. propName .. " ' not found in element '" .. element :getType () .. " '" )
103+ return nil
91104 elseif objName == " parent" then
92- return element .parent .get (propName )
105+ if element .parent ._properties [propName ] then
106+ return element .parent .get (propName )
107+ end
108+ if element .parent ._registeredStates and element .parent ._registeredStates [propName ] then
109+ return element .parent :hasState (propName )
110+ end
111+ local states = element .parent .get (" states" )
112+ if states and states [propName ] ~= nil then
113+ return true
114+ end
115+ errorManager .header = " Reactive evaluation error"
116+ errorManager .error (" Property or state '" .. propName .. " ' not found in parent element" )
117+ return nil
93118 else
94119 local target = element .parent :getChild (objName )
95120 if not target then
@@ -98,7 +123,19 @@ local function parseExpression(expr, element, propName)
98123 return nil
99124 end
100125
101- return target .get (propName )
126+ if target ._properties [propName ] then
127+ return target .get (propName )
128+ end
129+ if target ._registeredStates and target ._registeredStates [propName ] then
130+ return target :hasState (propName )
131+ end
132+ local states = target .get (" states" )
133+ if states and states [propName ] ~= nil then
134+ return true
135+ end
136+ errorManager .header = " Reactive evaluation error"
137+ errorManager .error (" Property or state '" .. propName .. " ' not found in element '" .. objName .. " '" )
138+ return nil
102139 end
103140 end
104141 }, { __index = mathEnv })
@@ -176,14 +213,26 @@ local function setupObservers(element, expr, propertyName)
176213 end
177214
178215 if target then
216+ local isState = false
217+ if target ._properties [prop ] then
218+ isState = false
219+ elseif target ._registeredStates and target ._registeredStates [prop ] then
220+ isState = true
221+ else
222+ local states = target .get (" states" )
223+ if states and states [prop ] ~= nil then
224+ isState = true
225+ end
226+ end
227+
179228 local observer = {
180229 target = target ,
181- property = prop ,
230+ property = isState and " states " or prop ,
182231 callback = function ()
183232 element :updateRender ()
184233 end
185234 }
186- target :observe (prop , observer .callback )
235+ target :observe (observer . property , observer .callback )
187236 table.insert (observers , observer )
188237 end
189238 end
@@ -196,7 +245,7 @@ PropertySystem.addSetterHook(function(element, propertyName, value, config)
196245 if type (value ) == " string" and value :match (" ^{.+}$" ) then
197246 local expr = value :gsub (" ^{(.+)}$" , " %1" )
198247 local deps = analyzeDependencies (expr )
199-
248+
200249 if deps .parent and not element .parent then
201250 return config .default
202251 end
0 commit comments