[ arsa xx @ 16.10.2004. 16:03 ] @
imam sledeci kod koji ne radi:

Code:

class News
{
    var newsXML:XML;
    
    function News ()
    {
        this.newsXML = new XML ();
        this.newsXML.onLoad = onLoadNews;
        this.newsXML.load ("news.xml");
    }
    
    function onLoadNews (ok)
    {
        if (ok)
        {
            var nt = this.newsXML.firstChild;
            trace ( nt.nodeName)
            if (nt.nodeName == "NEWSTICKER")
            {
                //....
                
            }
        }
    }
}


Kako da resim problem?
[ arsa xx @ 16.10.2004. 21:15 ] @
Problem sam resio u medjuvremenu.

falilo:
1.var firstChild;
2.this.newsXML.ignoreWhite = true;

Da li postoji elegantnije resenje (u sklopu klase)?

evo koda:
Code:

class NewsTicker
{
    var newsXML:XML;
    var firstChild;
    
    function NewsTicker ()
    {
        this.newsXML = new XML ();
        this.newsXML.ignoreWhite = true; 
        this.newsXML.onLoad = onLoadNews;
        this.newsXML.load ("news.xml");
    }
    
    function onLoadNews (ok)
    {
        if (ok)
        {
            var nt = this.firstChild
            trace ( nt.nodeName);
            if (nt.nodeName == "NEWSTICKER")
           {
                //....
                
           }
        }
    }
}

[ noviKorisnik @ 16.10.2004. 22:52 ] @
A ovo sada radi? Nije mi jasno kakvu vezu ima var firstChild. Rekao bih da je suvišna deklaracija. Jer se this.firstChild u onLoadNews odnosi na NewsTicker.newsXML.

Odnosno, onLoadNews je obrađivač događaja za instancu XML objekta a ovako izgleda i kao metod klase NewsTicker.

A ignoreWhite? Pa voleo bih da je po defaultu isključeno - XML.prototype.ignoreWhite = true - ali moguće je da mora ovako.
[ arsa xx @ 16.10.2004. 23:31 ] @
Radi ali ni meni nije jasno bas zbog cega mora 'var firstChild'.
A takodje nije mi ni jasno kako u funkciji onLoadNews() ne mogu da pristupim ni jednoj funkciji klase.
A bas sam pazljivo iscitao help > as reference guide.
Nesto sam ocigledno propustio.
[ arsa xx @ 16.10.2004. 23:50 ] @
Citat:
noviKorisnik:
....
Odnosno, onLoadNews je obrađivač događaja za instancu XML objekta a ovako izgleda i kao metod klase NewsTicker.
....


To je to, samo mi nije jasno kako da podatke vratim instanci glavne klase.
[ noviKorisnik @ 17.10.2004. 00:41 ] @
Citat:
A takodje nije mi ni jasno kako u funkciji onLoadNews() ne mogu da pristupim ni jednoj funkciji klase.

Mogao bi verovatno ako bi rekao myNewsTicker.onLoadNews (true) pa bi se u tom slučaju this odnosilo na instancu klase a samim tim bi radile sve metode klase. Ali to nije predviđeno da se poziva tako, zar ne?

Ovako, probaj da napraviš referencu na objekat u konstruktoru:
Code:
function NewsTicker ()
{
    this.newsXML = new XML ();
    this.newsXML.ticker = this;
    this.newsXML.ignoreWhite = true;
    this.newsXML.onLoad = onLoadNews;
    this.newsXML.load ("news.xml");
}


Tako bi mogao u onLoadNews da pozivaš metod klase sa this.ticker.metod ().

Naravno, proveri, jer nisam radio nešto više Flash 2004 pa možda se ponegde ne ponaša baš kao što bi se dalo očekivati...

Probaj takođe da komentiraš var firstChild. Da li javlja neku grešku ako se izostavi deklaracija?
[ arsa xx @ 17.10.2004. 11:14 ] @
Ovo sa referencom ne moze. Javlja gresku kad se izostavi > var firstChild.
>>> There is no property with the name 'firstChild'.
[ arsa xx @ 17.10.2004. 12:29 ] @
Nasao sam jako dobro objasnjenje problema:

http://www.kirupa.com/web/xml/XMLspecificIssues3.htm
[ noviKorisnik @ 17.10.2004. 13:33 ] @
Znači Delegati... Zanimljivo.

Koliko kontam, referenca bi mogla da prođe varkom kompajlera:this.newsXML ['ticker'] = this.
[ utvara @ 17.10.2004. 13:46 ] @
ax> A takodje nije mi ni jasno kako u funkciji onLoadXml() ne
ax> mogu da pristupim ni jednoj funkciji klase.

ax> A bas sam pazljivo iscitao help > as reference guide.

ax> Nesto sam ocigledno propustio.

Nisi, XML onLoad iskoci iz normalno ocekivanog skopa promenljivih.
Jedna varijanta koju ja redovno koristim je :

function a(){
var host = this;
var sender:XML;
var receiver:XML;

.....

receiver.onLoad = function(){
......
// promenjivam pristupas sa host. umesto this.
}
}

Imas dosta ljudi koje se jadaju zbog toga na netu. Cuo sam da je MM
izdala neko zvanicno resenje koje je komplikovano.

Zakljucak pametno resenje ne postoji.

MM vrlo nevesto uvodi OO u Flash (od izmisljanja tople vode u
prethodnim verzijama verijama i neki kompromisi u 2004).

poz. utvara

--
Sve najlepse,
Best regards,
Slobodan mailto:[email protected]
[ utvara @ 17.10.2004. 16:32 ] @
ax>
Code:


ax> class NewsTicker
ax> {
ax>     var newsXML:XML;
ax>     var firstChild;
ax>     function NewsTicker ()
ax>     {
ax>         this.newsXML = new XML ();
ax>         this.newsXML.ignoreWhite = true;
ax>         this.newsXML.onLoad = onLoadNews;
ax>         this.newsXML.load ("news.xml");
ax>     }

ax>     function onLoadNews (ok)
ax>     {
ax>         if (ok)
ax>         {
ax>             var nt = this.firstChild
ax>             trace ( nt.nodeName);
ax>             if (nt.nodeName == "NEWSTICKER")
ax>            {
ax>                 //....
ax>            }
ax>         }
ax>     }
ax> }
ax> 


Ubaci u onLoadNews liniju trace(this) kad uradis
test = new NewsTicker(); trace ce ti vratiti ...xyz.newsXML .

Problem je sto this u onLoadNews postaje newsXML kad se aktivira XML
load eventom. Gresku ti vraca kompajler jel ovako kako je napisano
onLoadNews je metod NewsTicker klase i onda ti on kulturno vraca da
nemas def firstChild.

Pravilan kod bi ti bio sledeci:

Code:

class NewsTicker
{
     var newsXML:XML;
     function NewsTicker ()
     {
         var host = this;
         this.newsXML = new XML ();
         this.newsXML.ignoreWhite = true;
         this.newsXML.onLoad = function(ok)
         {
             if (ok)
             {
                var nt = this.firstChild
                trace ( nt.nodeName);
                if (nt.nodeName == "NEWSTICKER")
                {
                    // this.nesto = ns.nodeValue;
                }
             }
         }
     }
     this.newsXML.load ("news.xml");
  }


Ja ne znam za elegantnije resenje.

--
Sve najlepse,
Best regards,
Slobodan mailto:[email protected]
[ -zombie- @ 23.10.2004. 12:20 ] @
ovaj, to sa čime se vi mačujete nema baš mnogo veze ni sa XMLom, ni sa makromedijom, a ni sa flešom, već sa načinom na koji objekti i metode funkcionišu u JSu (aka EcmaScript-u, aka ASu).

naime, dodela tipa:

objekat.događaj = funkcija;

faktički ubacuje funkciju u objekat, pa se this unutar nje odnosi na objekt (a ne na onaj kome originalna funkcija "logički" pripada "u kodu").


ovo se rešava tehnikom koju je utvara opisao, i koja se zove "closures" (potražite detalje)..