ugrás a tartalomhoz

PROTOTYPE kilép az objektumból?

gtoma · 2006. Dec. 30. (Szo), 18.28
Sziasztok!

Lenne egy problémám. Létrehozok egy objektumot, egy select mezőt. Aztán ajax-al lekérem a tartalmát. Ez az objektum egy funkciója lenne. A szerver válaszának feldolgozását rábízom egy funkcióra, mely szintén az Objektum része. Azonban ekkor már nem tudom lekérni az objektum adatait (pl. a select ID-jét amit az elején, az objektum létrehozásánál adok meg neki)



Íme a kód:

// JavaScript Document

function AnswerClear(ClearingAnswer)
	{
	var ClearingAnswer = ClearingAnswer.substring(2);
	SplitAnswer = ClearingAnswer.split('//');
	if (SplitAnswer[1] != "OK")
		{
		alert (SplitAnswer[1]);
		ClearAnswer = "";
		}
	else
		{
		ClearAnswer = SplitAnswer[2];
		}
	return ClearAnswer;
	}

function CountryList(ID)
	{
		this.CountryFormID = ID;
		this.QueryURL = 'adrserver.php';	
		this.QueryPars = 'com=countryquery&adr=country';
		this.QueryMethod = 'get';
	
	//functions
		this.ListAnswerNow = CountryAnswer;
		this.ListQueryNow = ListQuery;
	}

function CountryAnswer(originalRequest)
	{
	//put returned XML in the textarea
	var answer = originalRequest.responseText;
	var FormID = this.CountryFormID;

// A FormID sajnos undefinied, ugyanúgy ahogy a CountryFormID.
// Amennyiben az objektum nevén keresztül hivatkozom rá, úgy megtalálja. pl.: proba.CountryFormID
	alert(FormID);
	$("assaas").options[0] = new Option("Új ország felvitel", "uj");
	data = AnswerClear(answer);
	MyOptions = data.split('**');
	alert (MyOptions);
	if (MyOptions == '') { MyOptions = ''; }
	for (i = 0; i<MyOptions.length; i++)
		{
			MyOption = MyOptions[i].split('*-');
			OptiV=MyOption[0];
			OptiN=MyOption[1];
			OptiI=MyOption[2];
			OptiNumber = i+1;
			$('assaas').options[OptiNumber]=new Option(OptiN+" ["+OptiI+"]",OptiV,"");
		}

	}

function ListQuery()
	{
		var url = this.QueryURL;
		var myMethod = this.QueryMethod;
		var myPars = this.QueryPars;

// Itt van értéke a this.CountryFormID -nek
		alert(this.CountryFormID);
		var myAnswer = this.ListAnswerNow;
		var myAjax = new Ajax.Request( url, { method: myMethod, parameters: myPars, onComplete: myAnswer });
	}
és az objektum meghívása:

proba = new CountryList('assaas');

function haha()
{
proba.ListQueryNow();
}
Az ajax (prototype) miatt "esik" ki a program az objektumból? vagy valami alapvető hibát vétettem?

(BUÉK)
 
1

bindaseventlistener

Hodicska Gergely · 2006. Dec. 30. (Szo), 21.10
Szia!


Ez teljesen normális dolog, és nincs köze a prototypehoz, illetve annyiban mégis, hogy van benne támogatás a probléma elkerülésére: bindaseventlistener metódus.
particletree.com/notebook/prototype-and-the-this-keyword/
(valamiért csak az eredeti verzió nem elérhető)


Üdv,
Felhő
2

Nem teljesen értem a választ

gtoma · 2006. Dec. 31. (V), 14.18
Utána jártam az általad ajánlott válasznak. Nekem úgy tünik, hogy az általad ajánlott megoldás az esemény megtartására vonatkozik. (Angoltudásom nem elégséges az általad adott link megértésére, de megnéztem a bindaseventlistener leírását a prototype magyar leírásában.) Ennek ellenére ki is próbáltam, de nem tudtam eredményt elérni. A következő módokon próbáltam elérni a CountryFormID tulajdonságot:

1) akarmi = CountryFormID.bindAsEventListener(CountryList);

2) akarmi = bindAsEventListener(CountryList.CountryFormID);

3) akarmi = this.bindAsEventListener(CountryList.CountryFormID);

Sajnos egyik sem hozott eredményt. Továbbra is csak így találom meg objektumom tulajdonságait:

akarmi = proba.CountryFormID;

Olyan mintha a szerver válaszát feldolgozó fügvény nem az objektumom részeként futna, hanem valami kívülálló fügvény lenne.

Azt írod, ez teljesen normális. Én még azt sem értem mi "normális". Csak annyit látok, hogy szeretném futtatni az objektumom egy funkcióját, és abbol futtatni egy másik funkcióját. Logikám szerint végig az objektumon belül maradok. Kérlek röviden vázold nekem, hogy ebben a hibajelenségben mi is a normális? (Ezt nem kötegedésből kérdezem. Tényleg érdekel, hogy milyen szabály vonatkozik ide, ami akadályozza a számomra optimális működést.)

Köszönöm válaszodat.
4

re

toxin · 2006. Dec. 31. (V), 14.40
elsőnek itt kéne művelődni:
http://htmlinfo.polyhistor.hu/js13guide/obj.htm

majd a mester :) tollából
http://weblabor.hu/cikkek/oojsafelszinalatt

és utánna

már fogod érteni mit is csinálnak

Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
  }
}
üdv t

ui: HOPPÁ frissült az angol doksi http://www.sergiopereira.com/articles/prototype.js.html
dec 31-en :) 1.5.0_rc2-re, hiphip :))
3

bind, bindAsEventListener paraméterátadásra is jó

toxin · 2006. Dec. 31. (V), 14.19
úgyemlékszem a 1.5.0_rc1 -be került/változott meg a kódjuk ilyenre, ha valaki esetleg nem nézte volna :

Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [( event || window.event)].concat(args).concat($A(arguments)));
  }
}
azaz pl.

			var ButtonColor = 
			
				Class.create();
				ButtonColor.prototype = {
					
					initialize : function(){
						this.colors = ['red','blue','green'];
						this._append();
					},
					
					_append : function(){
						this.colors.each(function(color,index){
							var input = Builder.node('input',{id:'color_'+color,value:color,type:'button'});
							$('button_container1').appendChild(input);
							
							Event.observe(input,'click',function(event,input,color){
								alert (Event.element(event));
								this._shout(input);
								
								$('container').setStyle({backgroundColor:color});
								// a bindAsEventListener-el megmarad a context objektum, de megkapjuk az eseményt is, 
								// és már paramétereket is vihetünk át
							}.bindAsEventListener(this,$(input),color));
							
						}.bind(this));
					},
					
					_shout : function(input){
						alert(input.id);
					}			
			}
		 	
			Event.observe (window,'load',function(){
				new ButtonColor();		
			})
bindAsEventListener(this,$(input),color));


nagyon megtudja könnyíteni az életet :)
http://toxin.hu/weblabor/bind/foo.html

üdv t

ui: közben leltem egy jó cikket
http://encytemedia.com/blog/articles/2006/12/4/avoiding-bloat-in-widgets
pr osztályok öröklődése témában