Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.
Verwijderd
Nee, daar heeft het niet mee te maken. De this.method wordt uitgevoerd vanuit een andere methode van het betreffende object. Een alert( this ) geeft dan ook keurig aan dat this verwijst naar een object, maar als ik de eigenschappen/methoden probeer aan te roepen, mekkert ie dat deze niet gedefinieerd zijnVerwijderd schreef op vrijdag 23 december 2005 @ 14:33:
Van wat voor soort object ga je verwijzen? Als je een this.method uitvoerd vanaf een element zal this niet na je instantiatie verwijzen maar naar je element en dan zul je dus moeten scopen.
Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| function object()
{
this.id = "Test";
}
object.prototype.methode = function( data )
{
try {
this.methode2();
} catch( e ){ alert( e ); };
};
object.prototype.methode2 = function( data )
{
this.id = "Andre"
}
andre = new object();
andre.methode();
alert(andre.id) |
Het is bij mij ook het eerste probleem dat ik hiermee heb. Ik kan wel even wat details geven, misschien dat er dan bij iemand een lichtje gaat branden.André schreef op vrijdag 23 december 2005 @ 14:47:
Als ik het zo probeer krijg ik geen probleem:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21function object() { this.id = "Test"; } object.prototype.methode = function( data ) { try { this.methode2(); } catch( e ){ alert( e ); }; }; object.prototype.methode2 = function( data ) { this.id = "Andre" } andre = new object(); andre.methode(); alert(andre.id)
Het gaat om een javascript-gebaseerde file-browser die zijn gegevens ophaalt middels een ajax-call. Ik heb een aparte ajax-bibliotheek in dit project en die werkt goed. Omdat ik in eerste instantie (om het devven te versnellen) de data middels een losse functie bij het initialiseren van de browser liet inladen net zoals ik al mijn andere ajax-calls ook doe, gaf het nergens problemen en werkte als een tierelier.
Omdat ik nu een aantal functies heb ingebouwd zoals hernoemen van bestanden, verwijderen en verplaatsen enzo, ben ik aan het testen om vanuit de browser zelf die ajax-bibliotheek aan te roepen en het resultaat te verwerken (tot op dit moment paste ik gewoon middels wat DOM-scripting de elementen binnen de browser aan, dus een file hernoemen was 1) een call naar een server-side script om de bestandsnaam aan te passen en 2) de naam van het bestand in de file-collectie aanpassen, alle huidige bestanden uit de DOM verwijderen en vervolgens de gegevens zoals die in de file-collectie bekend waren opnieuw in de DOM neerzetten.
Ik moest maar hopen dat alles goed was gegaan. Omdat het script wel een xml-statusrapport gaf, wilde ik dat kunnen inlezen, maar daarbij gaat het op dezelfde manier fout als ik hieronder beschrijf. )
Omdat ook het opvragen van content in een dieper gelegen map nog via de eerder genoemde externe functie ging, wilde ik daar gewoon een methode van maken, ala browser.refresh(); Aan de functie in de ajax-bibliotheek moet ik doorgeven aan welke functie de response gevoerd moet worden, dus heb ik in refresh opgegeven: var self = this; en als return-functie aan de ajax-call: self.loadData, waarbij loadData gedefinieerd is als
1
| browser.prototype.loadData = function( data ){ /*blah blah*/}; |
Dit heeft overal gewerkt, en zo ook hier. Alleen als ik binnen die loadData nu een eigenschap of hethode van de browser opvraag, wil hij die niet geven. Vraag ik bijvoorbeeld op this.files.length, dan zegt ie: this.filecollection is geen object, terwijl dat zeker te weten wel het geval is. Ook een simple eigenchap als this.copyright, dat normaal gesproken een copyright-boodschap returned, is nu niet gedefinieerd.
Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.
ff koffie gedronken en nu ff constructor gechecked. En wie schets mijn verbazing?Verwijderd schreef op vrijdag 23 december 2005 @ 15:01:
Wat geeft de constructor van het object terug?
Ik zie dat this nu opeens verwijs naar mijn xmlhttp object
Hoe kan dat nu weer?
dit is de functie die het probleem geeft:
1
2
3
4
5
| browser.prototype._processAddDirectory = function( data ){ alert( this.constructor ); // geeft onverwacht niet de constructor van browser, maar van de xmlhttp-functionaliteit alert( data ); // geeft de verwachte response terug alert( this.copyright ); // gaat fout, undefined, want zit niet in mn ajax-lib }; |
het wordt aangeroepen door deze functie:
1
2
3
4
5
6
7
8
| browser.prototype.addDirectory = function( e ){ var self = this; //hier wordt wat code uitgevoerd, oa om de naam van de nieuwe directory op te vragen var postData = "action=addfolder&parent=" + escape( location ) + "&name="+ escape( name ); doPOSTRequest( getBase() + "cgi-bin/imagemanagement_manage.asp", postData, self._processAddDirectory ); }; |
[ Voor 126% gewijzigd door wizzkizz op 23-12-2005 15:33 ]
Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.
Omdat je misschien niet de returnwaarde aan je object toekent maar een referentie naar je xmlhttp object maakt?wizzkizz schreef op vrijdag 23 december 2005 @ 15:12:
[...]
ff koffie gedronken en nu ff constructor gechecked. En wie schets mijn verbazing?
Ik zie dat this nu opeens verwijs naar mijn xmlhttp object
Hoe kan dat nu weer?
Ik maak helemaal niet bewust (onbewust mss welAndré schreef op vrijdag 23 december 2005 @ 15:30:
[...]
Omdat je misschien niet de returnwaarde aan je object toekent maar een referentie naar je xmlhttp object maakt?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| function doPOSTRequest( url, data, handler ){ var ajax = new CallBackObject(); ajax.handleResponse = handler; ajax.doCallBack( 'POST', url, data ); } CallBackObject.prototype.OnComplete = function(responseText, responseXml) { this.responseText = responseText; this.responseXML = responseXml; this.status = 4; var returnValue = ( this.doReturn == 'xml' ) ? responseXml : responseText; if( this.debug ) alert( 'loading completed...' ); if( this.debug ) alert( returnValue ); try { this.handleResponse( returnValue ); } catch( e ) { }; }; |
[ Voor 6% gewijzigd door wizzkizz op 23-12-2005 15:46 ]
Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.
Ik vermoed dat het zit in
1
| this.handleResponse( returnValue ); |
Maar ik zou niet weten hoe ik dat anders op moet lossen. Ik heb al wat gespeeld met wat variaties maar ik kom er niet uit. Kan iemand helpen?
Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.
ik had ipv self.methode als functie die de response moest verwerken moeten opgeven
1
| function( data ){ self.methode( data ) } |
Make it idiot proof and someone will make a better idiot.
Real programmers don't document. If it was hard to write, it should be hard to understand.