Lifecycle
- model-construct
- rebuild
- recalculate
- revalidate
- model-construct-done
- init-done
- refresh-done
- ready
Update Cycle
When data mutations happen by Control changes:
- recalculate
- revalidate
- refresh
When data mutations happen by actions (trigger)
- recalculate
- revalidate
- refresh
Rebuild
sequenceDiagram
title:Dependency Tracking
autonumber
participant Model
participant FxBind
participant DependencyTracker
participant NodeBinding
participant FacetBinding
Note over Model: rebuild phase
Model->>Model: rebuild()
loop: fx-bind
Model->>FxBind: init()
activate FxBind
loop: this.nodeset
FxBind->>NodeBinding:new NodeBinding(modelIitem,fore)
activate NodeBinding
NodeBinding-->>DependencyTracker:registerBinding(xpath:node,NodeBinding)
NodeBinding-->>DependencyTracker:registerDependencies(xpath:node,NodeBinding)
activate NodeBinding
NodeBinding->>NodeBinding: registerFacets()
NodeBinding->>FacetBinding:new FacetBinding(modelItem, 'calculate')
NodeBinding-->>DependencyTracker:registerBinding(FacetBinding)
NodeBinding-->>DependencyTracker:registerDependency(xpath, xpath:calculate)
NodeBinding->>FacetBinding:new FacetBinding(modelItem, 'constraint')
NodeBinding-->>DependencyTracker:registerBinding(FacetBinding)
NodeBinding-->>DependencyTracker:registerDependency(xpath, xpath:constraint)
NodeBinding->>FacetBinding:new FacetBinding(modelItem, 'readonly')
NodeBinding-->>DependencyTracker:registerBinding(FacetBinding)
NodeBinding-->>DependencyTracker:registerDependency(xpath, xpath:readonly)
NodeBinding->>NodeBinding:_addFacetDependencies()
NodeBinding->>FacetBinding:new FacetBinding(modelItem, 'relevant')
NodeBinding-->>DependencyTracker:registerBinding(FacetBinding)
NodeBinding-->>DependencyTracker:registerDependency(xpath, xpath:relevant)
NodeBinding->>NodeBinding:_addFacetDependencies()
NodeBinding->>FacetBinding:new FacetBinding(modelItem, 'required')
NodeBinding-->>DependencyTracker:registerBinding(FacetBinding)
NodeBinding-->>DependencyTracker:registerDependency(xpath, xpath:required)
NodeBinding->>NodeBinding:_addFacetDependencies()
loop
NodeBinding->>DependencyTracker: mainGraph.addNode(xpath,node)
NodeBinding->>DependencyTracker: mainGraph.mainGraph.addDependency(facetKey, xpath)
end
deactivate NodeBinding
end
deactivate FxBind
end
Recalculate
sequenceDiagram
title: recalculate()
autonumber
participant Model
participant DependencyTracker
participant Binding
Note over Model: recalculate phase - first run
activate Model
Model->>DependencyTracker: dependencyGraph
loop: dependencyGraph.overallOrder()
Model->>Binding: update()
Binding->>DependencyTracker: pendingUpdates.delete(this)
end
Note over Model: recalculate with changes
deactivate Model
Model->>DependencyTracker: buildSubgraphForChanges
activate DependencyTracker
loop
DependencyTracker->>DependencyTracker: add pending Binding to subgraph
loop: dependencies
DependencyTracker->>DependencyTracker: add depencency to subgraph
end
end
DependencyTracker->>Model: ordered list of changes
deactivate DependencyTracker
activate Model
loop: list
Model->>Binding: update()
end
deactivate Model
Refresh
sequenceDiagram
title: refresh()
autonumber
participant Fore
participant BoundElement
participant Model
participant UIBinding
participant DependencyTracker
activate Fore
Note over Fore: first refresh after page load
Fore ->> Fore: refresh()
loop: iterate bound children
Fore->>BoundElement: refresh()
activate BoundElement
BoundElement->>Model: getModelItem()
BoundElement->>UIBinding: new()
BoundElement->>DependencyTracker: registerBinding(UIBinding)
BoundElement->>BoundElement: updateWidgetValue()
BoundElement->>BoundElement: handleModelItemProperties()
deactivate BoundElement
end
Fore->>Fore: dispatch 'refresh-done'
deactivate Fore
activate Fore
Note over Fore: subsequent refreshes
Fore ->> Fore: refresh()
Fore->>DependencyTracker: if(hasUpdates) processUpdates()
activate DependencyTracker
Note right of DependencyTracker: update template expressions of $default scope
DependencyTracker->>DependencyTracker: update(templateExpression)
loop: loop all template and control bindings
Note left of DependencyTracker: Control- or TemplateBinding
DependencyTracker->>UIBinding: update()
end
deactivate DependencyTracker
DependencyTracker->>Fore:
Fore->>Fore: dispatch 'refresh-done'
deactivate Fore