replaceReferences static method
Implementation
static String replaceReferences(
Observable observable, Scope? scope, String value) {
if (scope == null || observable.key == null || observable.bindings == null) {
return value;
}
bool requery = false;
for (Binding binding in observable.bindings!) {
// replace "this" with the id in the signature
if (binding.source == "this" || binding.source == "parent") {
requery = true;
// get source id
String sourceId = observable.key!.split(".").first;
if (binding.source == "parent") sourceId = parentId(scope, sourceId);
if (binding.property == "parent") {
sourceId = parentId(scope, sourceId);
for (var segment in binding.dotnotation ?? []) {
if (segment.name != "parent") break;
sourceId = parentId(scope, sourceId);
}
}
// build signature
var signature = sourceId;
if (binding.property != "parent") {
signature = "$sourceId.${binding.property}";
}
if (binding.dotnotation != null) {
int i = 0;
// skip parent dotnotation
while (i < binding.dotnotation!.length &&
binding.dotnotation![i].name == "parent") {
i++;
}
// append non-parent dotnotation
while (i < binding.dotnotation!.length) {
signature = "$signature.${binding.dotnotation![i++].name}";
}
}
// replace signature
value = value.replaceAll(binding.signature, "{$signature}");
}
}
// requery the bindings
if (requery) observable.bindings = Binding.getBindings(value, scope: scope);
return value;
}