angularjs - Hur konverterar man en sträng till ett Javascript-objekt med en egenskap och en funktionsreferens?


Jag skulle vilja skapa ett Javascript-objekt som innehåller en egenskap (onClick-exempel) av typen funktion (myClickHandler-exempel) så här:

var options = {onClick: this.myClickHandler};

Jag vill att objektet ovan ska skapas från en sträng eftersom options-objektet kan vara olika varje gång appen körs och jag vill att det ska utvärderas under körning. (myClickHandler är en befintlig funktion). Jag vill att options-objektet ska skapas från en sträng eftersom onClick-egenskapen kan vara något annat och dess funktion kan också vara något annat. Dessa bestäms från strängen som är dynamisk.

Letar efter något som detta:

var optionsString = "{onClick: this.myClickHandler}";  
var options = JSON.parse(optionsString); //won't work. For illustration only.

Detta kommer inte att fungera naturligt. Idealiskt sett vill jag konvertera strängen på en gång, men jag kanske måste analysera den, men optionString kan innehålla en eller flera egenskaper.

Svar #1

Försök att använda eval som:

var myClickHandler = function(){ alert('i am evil'); };
var options = JSON.parse('{ "onClick": "this.myClickHandler" }');

// anropar handlare nu

eval(options.onClick)();

Svar #2

Du behöver lite kontext där funktionen är bunden, så att du kan komma åt funktionen via nyckel (vilken kan vara en sträng).

let context = {};

context.myclickhandler = () => {
	console.log("### It clix ####")
}

let nameOfFunction = "myclickhandler"
let obj = {"onClick" : context[nameOfFunction]};
obj["onClick"]();

I exemplet är kontexten bara ett objekt, men det skulle också kunna vara window-objektet eller en instans av en konstruktörsfunktion.