21. září bude sraz! Od 18.00 v restauraci Tradice v Praze u Anděla
Autor Zpráva
ronnie
Profil
Dobrý den,

velmi jednoduchý dotaz. Jak se dostat k odkazu na aktuální instanci uvnitř metody TableAjax::createItems()? Psoudoproměnná this odkazuje na metodu, potřeboval bych přístup k objektu.



/**
* Trida pro zobrazeni casti ajaxem
*
* @author Jakub Mrozek, jakub.mrozek@gmail.com
* @version 20. 4. 2007
* @param string int ID dane polozky
*/
function TableAjax(id)
{
/**
* @var int id ID dane polozky
*/
this.id = id;

/**
* @var XMLHTTP objekt
*/
this.xmlHttp;

/**
* Vygeneruje URL
*
* @return String
*/
this.getUrl = function()
{
return location.href.substr(0, location.href.indexOf('/list')) + '/table-parts/?id=' + this.id;
}

/**
* Spusti akci pro generovani podpolozek
*/
this.show = function()
{
if (!this.id) {
return;
}
this.xmlHttp = window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : new XMLHttpRequest();
this.xmlHttp.onreadystatechange = this.createItems;
this.xmlHttp.open("POST", this.getUrl(), true);
this.xmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;');
this.xmlHttp.send(this.id);
}

/**
* Reaguje na vysledek statusu a readyState
*
*/
this.createItems = function()
{
if (this.xmlHttp.readyState == 4) {
if (this.xmlHttp.stats == 200) {
this.createTableItems();
}
}
}

/**
* Vytvori z JSON dat
*/
this.createTableItems = function()
{

}
ronnie
Profil
Resp. vím, že před metodou můžu volat

var obj = this;

a pak uvnitř metody přistupovat k objektu this přes proměnnou obj, to mi ale nepříjde jako příliš čisté řešení. Nešlo by to jinak?
ah01
Profil
Nejjednodušší je použít var that = this; „fígl“ přímo jak píšeš a nebo to nějak zaobalit, aby to vypadalo lépe.

Takže například.

var that = this;
this.xmlHttp.onreadystatechange = function(){ that.createItems.call(that);};


Nebo ještě hezčí je nadefinovat si metodu/funkci bind, což dnes používají v nějaké podobě asi všechny frameworky.

Function.prototype.bind = function(context){
var that = this;
return function(){ that.call(context); };
}

nebo pokud kopeš za tým odpůrců rozšiřování build-in objektů, takto

bind(fce, context){
return function(){ fce.call(context); };
}

použití by vypadalo takto:

this.xmlHttp.onreadystatechange = this.createItems.bind(this);

resp.

this.xmlHttp.onreadystatechange = bind(this.createItems, this);

což je ale ve výsledku, to samé jako první příklad, jen je to přehlednější.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0