Es gibt mehrere executeByName
Funktionen hier, was gut funktioniert, es sei denn, name enthält eckige Klammern - Problem, auf das ich gestoßen bin - da ich dynamisch generierte Namen habe. So oben Funktionen werden auf Namen wie fehlschlagen
app.widget['872LfCHc']['toggleFolders']
Als Abhilfe habe ich eine Funktion geschaffen, die auch dies berücksichtigt, vielleicht findet sie ja jemand nützlich:
Erzeugt aus CoffeeScript:
var executeByName = function(name, context) {
var args, func, i, j, k, len, len1, n, normalizedName, ns;
if (context == null) {
context = window;
}
args = Array.prototype.slice.call(arguments, 2);
normalizedName = name.replace(/[\]'"]/g, '').replace(/\[/g, '.');
ns = normalizedName.split(".");
func = context;
for (i = j = 0, len = ns.length; j < len; i = ++j) {
n = ns[i];
func = func[n];
}
ns.pop();
for (i = k = 0, len1 = ns.length; k < len1; i = ++k) {
n = ns[i];
context = context[n];
}
if (typeof func !== 'function') {
throw new TypeError('Cannot execute function ' + name);
}
return func.apply(context, args);
}
Für eine bessere Lesbarkeit überprüfen Sie auch die CoffeeScript-Version:
executeByName = (name, context = window) ->
args = Array.prototype.slice.call(arguments, 2)
normalizedName = name.replace(/[\]'"]/g, '').replace(/\[/g, '.')
ns = normalizedName.split "."
func = context
for n, i in ns
func = func[n]
ns.pop()
for n, i in ns
context = context[n];
if typeof func != 'function'
throw new TypeError 'Cannot execute function ' + name
func.apply(context, args)