tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
238
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    realpk realpk ist offline Mitglied Silber
    Registriert seit
    Feb 2005
    Beiträge
    63
    Hallo,
    ich stehe gerade vor einem konzeptionellen Problem.

    Wenn ich auf ein Event eines HTML-Elements reagiere, verlasse ich in dem Handler den this-Context.

    Damit besser klar ist, was ich meine, vorerst ein Teil meines Codes:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    Controller_answers = function()
    {
        this.options =
        {
            targetId : 'container_answers',
        };
            
        this._lastId = 0;
        
        this._getNew = function()
        {
            this._lastId++;
            return '<div class="container_answer" id="container_answer_' + this._lastId + 
                '"><input type="text"/><input type="button" value="Löschen" /></div>';
        };
        
        this.create = function()
        {
            $('#' + this.options.targetId).append(this._getNew());
            var id = '#container_answer_' + this._lastId;
            $(id).keypress(this._onKeyPress);
        };
        
        this._onKeyPress = function(e)
        {
            if(e.which === 13 && $('#container_answer_' + answers._lastId).value)
            {
                answers.create();
                $('#container_answer_' + answers._lastId).focus();
            }
        }
        this.create();
    }
     
    var answers = new Controller_answers();

    Wie zu erkennen ist, muss ich bei "_onKeyPress" auf die Instanz "answers" zurückgreifen. Mir wäre es lieber an dieser Stelle auch einen "generischen" Bezugspunkt zu nutzen. this bezieht sich ja leider nicht mehr auf diesen Context. Wenn ich nun mehrere Instanzen habe, kann ich es so gar nicht mehr nutzen.

    Hat jemand eine Idee?

    Vielen Dank und Grüße
     

  2. #2
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Ich persönlich baue meine Klassen anders auf. Aber du könntest einfach eine "private" Eigenschaft einführen, die auf this zeigt.

    Code javascript:
    1
    2
    3
    4
    5
    6
    7
    
    Controller_answers = function()
    {
        var _this = this;
     
        //Innerhalb aller Funktionen steht dir jetzt _this zu Verfügung
        //...
    }


    So baue ich persönlich Klassen auf. Dann hast du überall "self" zur Verfügung.

    Code javascript:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    
    function Class(v1, v2, v3 /*, v4, ...*/) {
        /*
            Private variables
        */
        var p1, p2, p3;//...
        
        //The actual object (also kind of a private variable)
        var self = {};
        
        /*
            Private methods
        */
        function pm1() {
            //...
        }
        
        function pm2() {
            //...
        }
        
        /*
            Public variables
        */
        self.pv1 = 'foobar';//...
        
        /*
            Public methods
        */
        self.m1 = function() {
            //Call private methods
            pm1();
            
            //Access private variable
            alert(p1);
        };
        
        self.m2 = function() {
            //...
        };
        
        
        return self;
    }
     

  3. #3
    realpk realpk ist offline Mitglied Silber
    Registriert seit
    Feb 2005
    Beiträge
    63
    Zitat Zitat von CPoly Beitrag anzeigen
    Ich persönlich baue meine Klassen anders auf. Aber du könntest einfach eine "private" Eigenschaft einführen, die auf this zeigt.

    Code javascript:
    1
    2
    3
    4
    5
    6
    7
    
    Controller_answers = function()
    {
        var _this = this;
     
        //Innerhalb aller Funktionen steht dir jetzt _this zu Verfügung
        //...
    }

    Danke aber das funktioniert so leider nicht.

    ReferenceError: _this is not defined

    Ich kann zwar auf this und _this in den Funktionen zugreifen. Aber der Eventhandler wird in einem anderen Context aufgerufen. An dieser Stelle gibt es kein Scope wo _this definiert ist.
     

  4. #4
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    In deinem Code ist die "_onKeyPress" Funktion im gleichen Scope wie die Variablen. Wie hast du es denn eingebaut?
    Da ich deine Klasse schlecht testen kann, hier mal ein schnelles Beispiel:

    HTML-Code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html id="html" xmlns="http://www.w3.org/1999/xhtml" lang="de" xml:lang="de">
    <head>
    	<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    	
    	<title>OOP</title>
    </head>
    
    <body>
    	<div id="foobar"></div>
    	
    	<script type="text/javascript">
    	/* <![CDATA[ */
    	function Class(id) {
    		var obj = document.getElementById(id);
    		var _this = this;
    		
    		this.bla = 'blub';
    		
    		this.html = function(str) {
    			obj.innerHTML = str;
    		}
    		
    		this.addClickHandler = function() {
    			obj.onclick = this._onClick;
    		}
    		
                    //Wäre auch schöner als private Methode. Niemand muss diese von außen aufrufen können
    		this._onClick = function() {
    			//Auch wenn this jetzt das div-element ist, kann ich sehr wohl auf die Variable _this zugreifen.
    			_this.html('woooooot');
    			alert(_this.bla);
    		};
    	}
    	
    	var c = new Class('foobar');
    	c.addClickHandler();
    	c.html('beer');
    	/* ]]> */
    	</script>
    </body>
    
    </html>
     

  5. #5
    realpk realpk ist offline Mitglied Silber
    Registriert seit
    Feb 2005
    Beiträge
    63
    Oh danke es funktioniert doch. Firebug ist dabei selber etwas buggy. Es zeigt bei mir noch immer ReferenceError: _this is not defined an.
     

Ähnliche Themen

  1. Context sensitive Hilfe
    Von Tagamoga im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 3
    Letzter Beitrag: 26.05.09, 10:29
  2. Bean aus Context lesen
    Von MasterGenny im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 3
    Letzter Beitrag: 21.09.07, 18:33
  3. Context Menu Extension
    Von frager im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 01.05.06, 11:37
  4. Context Menüs
    Von FlashMX im Forum .NET Windows Forms
    Antworten: 2
    Letzter Beitrag: 21.08.05, 19:21
  5. jsp auf Servlet Context zugreifen
    Von seawolf im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 24.04.04, 15:34

Stichworte