• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

jQuery - Klassen-Methode mittels String ausführen

Puccini

Neues Mitglied
Hi.
ich mal wieder -.-

ich hab eine einfache funktion, welche mir daten aus einem array formatiert ausgibt.
Im array selbst gibt es das feld "button" und dieses beinhaltet name+funktion die aufgerufen werden soll.

für die klassen-instanzen gibt es dann die methode "getInfo".
Da drin wird die globale "info"-funktion mit den daten versorgt. Klappt!
Nur leider klappt es nicht, das ich die Funktion der jeweiligen Instanz noch ausführen kann, wenn ich auf einen button klicke.

Wenn ich es so schreibe:
Code:
if(data["button"])
    {
        $.each(data["button"], function(key, value){
            $('<button>').text(key).click(function(){
                $(this).data("object").update();
            }).data("object",data["object"]).appendTo('#info');
        });
    }
geht es, da ja die funktion "update" in der klasse definiert ist (das mit dem data["object"] musste ich so machen, um die instanz zu erhalten. mittels:
Code:
tmpData["object"] = this;
$('<img>').data(tmpData);
weise ich dem html-objekt verschiedene daten zu und uim bei einem click-event wieder die instanz zu bekommen, hab ich das "object" mti gespeichert... ich weis nicht ob das auch anders gänge... sieht mir sehr kompliziert aus!)

wenn ich in der oberen "click"-funktion jedoch versuche dynamisch mittels dem "value" (welcher dann "update()" beinhaltet) die funktion aufzurufen geht das natürlich nicht:
Code:
$(this).data("object").value;
weil die klasse die methode "value" nicht kennt.

gibt es eine art "eval" für das objekt? globalEval hab ich schon probiert, geht nicht.
Kann ich das irgendwie anders lösen? ich sehe grad den wald vor lauter bäumen nicht :<

hier die verschiedenen arten wie ich die buttons setze:
Code:
tmpData["button"] = {'Update':this.update,'Sell': this.sell};
tmpData["button"] = {'Update':'update()','Sell': 'sell()'};
tmpData["button"] = {'Update':'update','Sell': 'sell'};
danke für eure hilfe!
 
ich hab eine einfache funktion, welche mir daten aus einem array formatiert ausgibt.
Im array selbst gibt es das feld "button" und dieses beinhaltet name+funktion die aufgerufen werden soll.

für die klassen-instanzen gibt es dann die methode "getInfo".
Da drin wird die globale "info"-funktion mit den daten versorgt. Klappt!
Nur leider klappt es nicht, das ich die Funktion der jeweiligen Instanz noch ausführen kann, wenn ich auf einen button klicke.
Kannst du dein Problem nicht so zeigen, dass es für Aussenstehende verständlich ist?

Wie erzeugst du den Button?
Wo kommt die funktion update() her?
Welche Beziehung bestehe zwischen dem Button und der Funktion?
 
hier mal ein exemplar-code:

Code:
function myObject()
{
    this.status = 1;
    var tmpData = new Object();
            tmpData["typ"] = "Object";
            tmpData["object"] = this;
            tmpData["button"] = {'Update':this.update,'Sell': this.sell};
    this.object = $('<img>')
        .data(tmpData)
        .click(function(){
            //this ist hier das jquery-objekt und nicht mehr die instanz, daher vorher alles in data abgelegt
            info($(this).data());
        })
        .appendTo('#content');
}

myObject.prototype.update = function()
{
    this.status++;
}


function info(data)
{
    var tmpTxt;
    
    tmpTxt = '<label>Typ:</label><span>'+data['typ']+'</span>';
    $('#info').html(tmpTxt);
    if(data["button"])
    {
        $.each(data["button"], function(key, value){
            $('<button>').text(key).click(function(){
                //hier scheiter value,,, mit ".update()" gehts natürlich 
                $(this).data("object").value;
            }).data("object",data["object"]).appendTo('#info');
        });
    }
}

hoffe der hilft weiter.
ich speichere quasi in den daten des jquery-objekts die instanz meiner klasse nochmal ab
und jetzt will ich bei dem klick auf das html-objekt natürlich die daten haben.
das geht wie gesagt. nur wenn ich dann noch bei dem button reagieren will komm ich nicht weiter!
 
Das wirkt alles reichlich umständlich und du vermischt alte Techniken mit Neuen und baust umständlich Sachen nach, die jquery schon integriert hat.


Die Callbackfunktionen in dem button Objekt musst du mit einem closure erzeugen, damit der Kontext erhalten bleibt. Dafür brauchst du auch eine Kopie des lokalen Objektes.

Code:
var _this = this;
var tmpData = {
    typ: "Object",
    object: this,
    button: {'Update':function() {_this.update(),}'Sell': function() {_this.sell(); }}
};

Das müßte ohne Probleme gehen, wenn du dein Objekt mit new erzeugst:

Code:
function myObject() {
    this.status = 1;
var _this = this;
var tmpData = {
    typ: "Object",
    object: this,
    button: {'Update':function() {_this.update(),}'Sell': function() {_this.sell(); }}
};
    this.object = $('<img>')
        .click(function(){
            info(tmpData);
        })
        .appendTo('#content');
}

und in Info rufst du die Funktion mit value() auf.

Für diese ganze Problematik stehen aber auch in jquery Spezielle Funktionen wie z.b. bind() zu Verfügung
 
hmmm

wie soll ich das da mit bind lösen?
wie gesagt, mir kam es ja auch sehr umständlich vor.

das mit dem closur werd ich versuchen. klingt einleuchtend :D
thx so far!
 
Zurück
Oben