[ S A J A @ 12.10.2016. 12:33 ] @
Pozdrav svima. Sledi moj problem:

Imam html element <select id='spisak'> i za njega (i slične) sam napravio klasu "combo" koja se kod instanciranja zakači na taj select element i pruža mi neke operacije da pojednostavim rad.

Na primer, imam metod sa kojim mogu da dodajem stavke:

Code:
add_item(id, text) {
     this.html += '<option value="' + id + '">' + naziv + '</option>';
}


i druge slične metode (selektuj prvi, generiši stavke na osnovu niza itd...) i to sve super radi.

Ono što bi mi trebalo jeste da na element prosledim metode koje nisam implementirao.

Na primer, ako neko stavi:

Code:
let combo = new combo('#spisak');
combo.nepoznata_funkcija(x);


da u klasi _nekako_ vidim da je zatražena nepoznata funkcija i da je prosledim direktno na element, otprilike ovako:

Code:
if (nepoznata funkcija) 
    $(this.element).nepoznata_funkcija(x);



Drugim rečima, da sve ono što nisam predvideo od metoda u svojoj klasi, direktno prosledim na objekat koji koristim u klasi.

Jel tako nešto moguće?


[ jablan @ 12.10.2016. 12:53 ] @
Nije.

Baci pogled ovde

http://stackoverflow.com/quest...e-rubys-method-missing-feature

i ovde:

https://developer.mozilla.org/...Reference/Global_Objects/Proxy

Uostalom, zašto prilikom "instanciranja" svoje wrapper klase ne izložiš wrappovani element kao property svoje klase i onda svako može da zove combo.element.nepoznata_funkcija()
[ S A J A @ 12.10.2016. 13:08 ] @
Citat:
jablan
Uostalom, zašto prilikom "instanciranja" svoje wrapper klase ne izložiš wrappovani element kao property svoje klase i onda svako može da zove combo.element.nepoznata_funkcija()


Odlična ideja, tako sam uradio. I to će da mi vrši posao. Mnogo hvala.

Code:
class combo {
    constructor(element) {
        this.element = $(element);
[ plus_minus @ 12.10.2016. 13:10 ] @
Citat:
S A J A: Pozdrav svima. Sledi moj problem:

Imam html element <select id='spisak'> i za njega (i slične) sam napravio klasu "combo" koja se kod instanciranja zakači na taj select element i pruža mi neke operacije da pojednostavim rad.

Na primer, imam metod sa kojim mogu da dodajem stavke:

Code:
add_item(id, text) {
     this.html += '<option value="' + id + '">' + naziv + '</option>';
}


i druge slične metode (selektuj prvi, generiši stavke na osnovu niza itd...) i to sve super radi.
...
...
...


Ovaj gore tvoj primer sa `plus_equals` .. je sve samo ne super.

`dodeljivanje` += (ili `assignment`) ... to se ne radi sa DOM nodama/elementima i objektima..

Da je PHP u pitanju, mož' da prođe.. sa '.=' npr.. ili sa `+=` takođe (zavisi), ali, u JS... ako nije tekst (string), ne mož' da bude dobro.

Nikako.

Da ti lepo prvo taj deo naučiš da radiš drugačije...

Evo... Document.createElement() - Web APIs | MDN
[ S A J A @ 12.10.2016. 13:27 ] @
Nisam baš razumeo ovo sa += što ne može. Jer meni to normalno radi a kad radi onda ne diram :)

Dakle, gornji primer je pravljen da ilustruje drugi problem, ovo vezano za dodavanje stavki otprilike ovako izgleda:

Code:
this.html = "";
for (var i = 0; i < this.data.length; i++) {
    var id = this.data[i].id;
    var naziv = this.data[i].naziv;
    this.html += '<option value="' + id + '">' + naziv + '</option>';
}
this.element.html(this.html);


Što to ne može tako? U pitanju JESTE string.
[ dusans @ 12.10.2016. 13:40 ] @
Šta će ti this.html kad za to možeš da koristiš lokalnu varijablu?
[ plus_minus @ 12.10.2016. 14:01 ] @
Citat:
S A J A:
Nisam baš razumeo ovo sa += što ne može. Jer meni to normalno radi a kad radi onda ne diram :)

Dakle, gornji primer je pravljen da ilustruje drugi problem, ovo vezano za dodavanje stavki otprilike ovako izgleda:

Code:
this.html = "";
for (var i = 0; i < this.data.length; i++) {
    var id = this.data[i].id;
    var naziv = this.data[i].naziv;
    this.html += '<option value="' + id + '">' + naziv + '</option>';
}
this.element.html(this.html);


Što to ne može tako? U pitanju JESTE string.


Postoji logika da je svaki mogući do sad ispisani (bukvalno svaki mogući od datuma postanka) JS kod - čist string.
Baš kao i .css.

Što i jeste.

Code (php):

echo(file_get_contents('/my/javascript/dir/script.js'));
 


i dobiješ .. string.

Veliki.

Ali.. postoji i JS logika, SVRHA JS-a .. koja kaže da je <option> zapravo - Objekat. DOM element... noda..

Ako radi ne diraj ga (ukoliko tabla - nije nakrivo).

Šta sa tim <option> tagom radiš posle? (ne verujem da ti je to za `alert` ili console.info() .. )
Popunjavaš i modifikuješ DOM tree.. ?
Praviš dinamički html/formu .. ?

Ako to radiš, pristup kojim radiš jeste totalno pogrešan.

Kosi se sa samom svrhom korišćenja javaskripte u html-u.

U JS, tagovi su elementi ili objekti. Nisu stringovi. Toliko prosto.

To bi iz cuga trebalo da prihvatiš ...

Isto tako taj loop gore..

Spor.

Ovako je brže ..
(a ti zameni c sa i) ...

Code (javascript):


 var c = 0, cc = this.data.length;
 for (; c<cc; c++) {
  // ...
 }
 

[ S A J A @ 12.10.2016. 14:04 ] @
Citat:
dusans: Šta će ti this.html kad za to možeš da koristiš lokalnu varijablu?


To je uprošćen primer, imam više metoda pa sam tako stavio. Ne stoji sve to tako zajedno. Deklaracija je u konstruktoru, dodavanje jedne stavke je posebna metoda, dodavanje na osnovu niza je druga metoda, vraćanje svega toga na stranicu je treća metoda...

Sad se premišljam da li unutar klase da stavke vodim kao html string (kao sada) ili da mi sve stoji kao niz pa na kraju da napravim html. Hm... ipak ću da se prebacim na niz, možda mi zatreba neki sort ili slična manipulacija sa podacima. Malo sam skrenuo sa teme, glavna ideja mi je bila da automatizujem operacije nad combo elementima pa sad gledam da pokrijem sve što sam koristio.
[ S A J A @ 12.10.2016. 14:16 ] @
Citat:
plus_minus:
Šta sa tim <option> tagom radiš posle? (ne verujem da ti je to za `alert` ili console.info() .. )
Popunjavaš i modifikuješ DOM tree.. ?
Praviš dinamički html/formu .. ?


Ideja mi je da automatizujem rad sa combo elementima. Na strani su iscrtani prazni <select> elementi a onda ih popunjavam, nekad ručnim podacima a često preko ajax poziva. Zato sam napravio klasu koja mi sve to objedinjuje da smanjim kod. Na primer, kad hoću da popunim listu sa podacima sa servera, ja stavim:

Code:
let izbor = new combo('#izbor');
$.when( ajax({'daj_podatke':''}) ).done(function(x) {
    izbor.add_item('0','Prva stavka');
    izbor.data(x);
    izbor.sort();
    izbor.generate_items();
    izbor.render();
});


Otprilike tako bi to trebalo da radi. Zapravo već i radi tako samo da vidim šta će mi još trebati da pokrijem. Ranije sam za to imao mnogo koda i tako za svaki combo, sad bi da malo uprostim.

Slažem se da su elementi elementi a ne string, samo ja dolazim do tih elemenata tako što napravim string pa ga ubacim negde u DOM. Možda to nije idealno ali meni vrši posao. Nisam profesionalni programer pa gledam da jednostavna rešenja.