looping τα properties ενος object

Κώδικας, πληροφορίες, ερωτήσεις και απαντήσεις σχετικές με την JavaScript.

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Serghio
Δημοσιεύσεις: 452
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

looping τα properties ενος object

Δημοσίευση από Serghio » 04 Νοέμ 2013 13:34

Bρήκα έναν κώδικα για να εμφανίζω στον browser το μηνύματα σφάλματος αν ο server-side validation αποτυγχάνει.
Αυτός είναι:

Κώδικας: Επιλογή όλων

         for (var key in data) {
  if (data.hasOwnProperty(key)) {
   alert(key + " -> " + data[key]);
  }
} 
Το alert το χρησιμοποιώ για testing...ο κώδικας δουλεύει.
Ο τελικός σκοπός όμως δεν είναι να βγαίνει ένα alert box αλλά να τυπώνονται τα μηνύματα,
όπως προανέφερα στον browser...κατέληξα σε αυτό λοιπόν:

Κώδικας: Επιλογή όλων

         for (var key in data) {
  if (data.hasOwnProperty(key)) {
   
 $('#adrserror').htlm(key+data[key]);
    
  }
} 
To adrserror είναι ένα άδειο span element το οποίο κανονικά με το να παραπάνω κώδικα θα έπρεπε να γεμίσει με τα αντίστοιχα μηνύματα.Αλλά, αντι αυτού, η κονσόλα του dev tools εμφανίζει αυτό:

Κώδικας: Επιλογή όλων

Uncaught TypeError: Object [object Object] has no method 'htlm' 
Τι φταίει λοιπόν;
Το μήνυμα καταλαβαίνω τι σημαίνει...αυτό που δεν καταλαβαίνω είναι γιατί εμφανίζεται.

Άβαταρ μέλους
korgr
Honorary Member
Δημοσιεύσεις: 5067
Εγγραφή: 07 Οκτ 2008 18:30
Τοποθεσία: Corinth
Επικοινωνία:

looping τα properties ενος object

Δημοσίευση από korgr » 04 Νοέμ 2013 13:58

Δεν είναι .htlm
Είναι .html
:)

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

looping τα properties ενος object

Δημοσίευση από alou » 04 Νοέμ 2013 15:09

+ έτσι θα μένει στο #adrseror μόνο το τελευταίο μύνημα. Θα πρότεινα να είναι ένα άδειο ul element το adrserror, να φτιάχνεις την html σε μια μεταβλητή και να το τοποθετείς μετά:

Κώδικας: Επιλογή όλων

var printErrors = '';
  for (var key in data) {
  if (data.hasOwnProperty(key)) {
   
printErrors += '<li>' + key+data&#91;key&#93; + '</li>';
  &#125;
&#125;
$&#40;'#adrserror'&#41;.htlm&#40;printErrors&#41;; 
Τελευταία επεξεργασία από το μέλος alou την 04 Νοέμ 2013 18:26, έχει επεξεργασθεί 1 φορά συνολικά.

Serghio
Δημοσιεύσεις: 452
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

looping τα properties ενος object

Δημοσίευση από Serghio » 04 Νοέμ 2013 17:08

alou έγραψε:+ έτσι θα μένει στο #adrseror μόνο το τελευταίο μύνημα.
Όπως το λες...
Χρησιμοποιήσα τελικά τον δικό σου κώδικα.

Serghio
Δημοσιεύσεις: 452
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

looping τα properties ενος object

Δημοσίευση από Serghio » 04 Νοέμ 2013 19:51

Υπάρχει ένα θέμα όμως...
Αν ο server δεν στείλει μηνύματα λάθους(που σημαίνει ότι όλοι οι έλεγχοι είναι ΟΚ)αυτό που συμβαίνει είναι ότι δημιουργούνται άδεια li...και όσες φορές τρέχει το loop, τόσα και τα άδεια li.

To loop εξετάζει αν το data object έχει properties. Η αλήθεια είναι όμως ότι πάντα θα έχει διότι στο php script η λογική που ακολουθείται είναι ότι αν το validation αποτυγχάνει "δείξε το μήνυμα"(το οποίο περνιέται σε array και έπειτα τα γνωστά...echo...json encode) ειδάλλως "στείλε empty string". Nα ο server-side κώδικας-οχι ολος να πάρετε μια ιδέα μόνο:

Κώδικας: Επιλογή όλων

if&#40; ajax_update_password&#40;$conn,$newpass,$dbnowpass,$sessionml&#41;&#41;
&#123; $checkpass&#91;'update'&#93;='';&#125;
 else
&#123;$checkpass&#91;'update'&#93;='Δεν έχεις βάλει σωστό τωρινό κωδικό';&#125;
        
 echo json_encode&#40;$checkpass&#41;;    
&#125;
Εν ολίγοις, αν ανανεωθεί ο κωδικός με επιτυχία στέλνεται στον client-string empty string, αλλιώς το μήνυμα.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

looping τα properties ενος object

Δημοσίευση από dva_dev » 04 Νοέμ 2013 20:55

Στο συγκεκριμένο "πρόβλημα" θα σου πρότεινα δύο πιθανές λύσεις (διαλέγεις και παίρνεις)
α) Να αλλάξεις τη λογική και αν δεν υπάρχει λάθος μην στέλνεις ούτε empty string.
β) Να αλλάξεις τον έλεγχο και αν είναι empty string μην κάνεις τίποτα

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

looping τα properties ενος object

Δημοσίευση από alou » 05 Νοέμ 2013 17:26

Το αντικείμενο που φτιάχνεις για να στείλεις την απάντηση, μπορεί και πρέπει να έχει ότι στοιχείο χρειάζεσαι για να κάνεις τους απαραίτητους ελεγχους και να δώσεις τις πληροφορίες που πρέπει στον χρήστη.

Που σημαίνει ότι κακώς χρησιμοποιείς το ίδιο κομμάτι του data για τα σφάλματα και για οτιδήποτε άλλο.

Η php μεταβλητή ας πούμε $result που θα κάνεις json encode, μπορεί να έχει για παράδειγμα:

$result['result'] = success / fail /error ή οπως θες
$result['messages'] = array με messages
$result['alerts'] , $result['element'], $result['action']...

και έχεις διαχωρίσει τη λογική που αντιμετωπίζεις το ajax promise πχ αν $data['result'] == 'success' κάνε αυτό, αλλιώς τύπωσε τα σφάλματα, αν υπάρχει action, κάνε αυτό το action σε εκείνο το data['element'] ή ότι άλλο μπορεί να χρειαστείς σαν στοιχείο.

Serghio
Δημοσιεύσεις: 452
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

looping τα properties ενος object

Δημοσίευση από Serghio » 05 Νοέμ 2013 17:33

alou έγραψε:Το αντικείμενο που φτιάχνεις για να στείλεις την απάντηση, μπορεί και πρέπει να έχει ότι στοιχείο χρειάζεσαι για να κάνεις τους απαραίτητους ελεγχους και να δώσεις τις πληροφορίες που πρέπει στον χρήστη.

Που σημαίνει ότι κακώς χρησιμοποιείς το ίδιο κομμάτι του data για τα σφάλματα και για οτιδήποτε άλλο.

Η php μεταβλητή ας πούμε $result που θα κάνεις json encode, μπορεί να έχει για παράδειγμα:

$result['result'] = success / fail /error ή οπως θες
$result['messages'] = array με messages
$result['alerts'] , $result['element'], $result['action']...

και έχεις διαχωρίσει τη λογική που αντιμετωπίζεις το ajax promise πχ αν $data['result'] == 'success' κάνε αυτό, αλλιώς τύπωσε τα σφάλματα, αν υπάρχει action, κάνε αυτό το action σε εκείνο το data['element'] ή ότι άλλο μπορεί να χρειαστείς σαν στοιχείο.
Δεν μπερδεύονται όμως έτσι περισσότερα τα πράγματα όσον αφορά τους client side ελέγχους?
Σε γενικές γραμμές με έχει ταλαιπωρήσει μέχρι τώρα...δεν έχω καταλήξει στην βέλτιστη λύση ακόμα.

Serghio
Δημοσιεύσεις: 452
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

looping τα properties ενος object

Δημοσίευση από Serghio » 05 Νοέμ 2013 17:59

Έχω καταλήξει στην εξής λογική που δεν ξέρω όμως πως να μετατρέψω σε κώδικα.
Καταρχήν, προς το παρόν δεν πειράζω τίποτα server-side(τουλάχιστον για τώρα).
Η λογική είναι:
Αν βρεθεί μηνυμα στο data object(που σημαίνει σφάλμα) τυπώνω τα μηνύματα, αν δεν βρώ μυνήματα τότε π.χ κλείνω την φόρμα...να ο κώδικας

Κώδικας: Επιλογή όλων

 for &#40;var key in data&#41; &#123;
                  if &#40;data&#91;key&#93;!==''&#41; &#123;//αυτό σημαίνει οτι υπάρχουν σφάλματα
             printErrors += '<li>' + data&#91;key&#93; + '</li><br>'; 
             $&#40;'#passerror'&#41;.html&#40;printErrors&#41;; 
                  &#125;
                  else&#123; alert&#40;'hi'&#41;;&#125;//για test αυτό
                &#125; 
Ποιό όμως είναι το πρόβλημα με το παραπάνω;
Αν το data object περιέχει έστω και ένα empty string αμέσως τρέχει το else.Το σωστό είναι να τρέχει το else μόνο όταν ΟΛΑ τα keys του data object έχουν empty strings.

Τι θα μπορούσα να κάνω; Ας ξεχάσουμε προς το παρόν το server-side εκτός και αν δεν υπάρχει εναλλακτική.

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

looping τα properties ενος object

Δημοσίευση από dva_dev » 05 Νοέμ 2013 18:28

Για δοκίμασε κάτι τέτοιο:

Κώδικας: Επιλογή όλων

var countErrors = 0;
for &#40;var key in data&#41;
&#123;
	if &#40;data&#91;key&#93;!==''&#41;
	&#123;
		//αυτό σημαίνει οτι υπάρχουν σφάλματα
		printErrors += '<li>' + data&#91;key&#93; + '</li><br>';
		countErrors++;
	&#125;
&#125;

if &#40;countErrors > 0&#41; &#123;
	$&#40;'#passerror'&#41;.html&#40;printErrors&#41;;
&#125;
else &#123;
	//για test αυτό
	alert&#40;'hi'&#41;;
&#125;

Serghio
Δημοσιεύσεις: 452
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

looping τα properties ενος object

Δημοσίευση από Serghio » 05 Νοέμ 2013 20:54

Oxι, δεν έπιασε.Αυτός είναι ο κώδικας ολοκληρωμένος...όπως εμπεριέχεται στην success function:

Κώδικας: Επιλογή όλων

  success&#58;function&#40;data&#41;&#123;
             var printErrors = '';
             var countErrors = 0;
              for &#40;var key in data&#41; &#123;
                  if &#40;data&#91;key&#93;!==''&#41; &#123;//αυτό σημαίνει οτι υπάρχουν σφάλματα
                
                   printErrors += '<li>' + data&#91;key&#93; + '</li><br>'; 
                   countErrors++; 
                  &#125;
                  if &#40;countErrors > 0&#41; &#123; 
                    $&#40;'#passerror'&#41;.html&#40;printErrors&#41;; 
                    &#125;
                  else&#123; alert&#40;'hi'&#41;;&#125;
                &#125; 
                  &#125;,
Προσπαθώ να το δουλέψω και μόνος μου...εν ανάγκη θα αναπροσαρμόσω τον server-side κώδικα-θα εξαντλήσω τις πιθανότητες πρώτα όμως.

Serghio
Δημοσιεύσεις: 452
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

looping τα properties ενος object

Δημοσίευση από Serghio » 05 Νοέμ 2013 20:57

Serghio έγραψε:Oxι, δεν έπιασε.Αυτός είναι ο κώδικας ολοκληρωμένος...όπως εμπεριέχεται στην success function:

Κώδικας: Επιλογή όλων

  success&#58;function&#40;data&#41;&#123;
             var printErrors = '';
             var countErrors = 0;
              for &#40;var key in data&#41; &#123;
                  if &#40;data&#91;key&#93;!==''&#41; &#123;//αυτό σημαίνει οτι υπάρχουν σφάλματα
                
                   printErrors += '<li>' + data&#91;key&#93; + '</li><br>'; 
                   countErrors++; 
                  &#125;
                  if &#40;countErrors > 0&#41; &#123; 
                    $&#40;'#passerror'&#41;.html&#40;printErrors&#41;; 
                    &#125;
                  else&#123; alert&#40;'hi'&#41;;&#125;
                &#125; 
                  &#125;,
Προσπαθώ να το δουλέψω και μόνος μου...εν ανάγκη θα αναπροσαρμόσω τον server-side κώδικα-θα εξαντλήσω τις πιθανότητες πρώτα όμως.
Πάντως ο κώδικας σου φαινόταν ΟΚ με την πρώτη ματιά...προσπαθώ να ξαναδω για δεν λειτουργεί όπως πρέπει.

Serghio
Δημοσιεύσεις: 452
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

looping τα properties ενος object

Δημοσίευση από Serghio » 05 Νοέμ 2013 21:50

τελικά ο κώδικας σου ήταν ΟΚ...έπρεπε το if(counterrors>0) να βγει έξω από το loop.

thanks

Serghio
Δημοσιεύσεις: 452
Εγγραφή: 08 Φεβ 2011 19:20
Τοποθεσία: Περιστέρι

looping τα properties ενος object

Δημοσίευση από Serghio » 06 Νοέμ 2013 20:14

υπάρχει μια τελευταία ερώτηση που θέλω να κάνω σχετικά με τον κώδικα αυτό:

Κώδικας: Επιλογή όλων

data&#91;key&#93;
Γιατι ενω έχουμε να κάνουμε object προσπαθούμε να αποκτήσουμε πρόσβαση σε αυτό σαν να είναι array;

κανονικά δεν θα έπρεπε να ήταν data.key;

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

looping τα properties ενος object

Δημοσίευση από alou » 06 Νοέμ 2013 20:56

Στη javascript δεν υπάρχει διαφορά μεταξύ object & associative array, ισχύουν και τα δυο σαν σύνταξη

Κώδικας: Επιλογή όλων

        var anObject = &#123;&#125;;
	anObject&#91;'hand'&#93; = '5 fingers';
	anObject.foot = '5 fingers';
	alert&#40;'foot has ' + anObject.foot + ' and hand has ' + anObject&#91;'hand'&#93;&#41;;
αλλά όχι anObject[1]

Απάντηση

Επιστροφή στο “JavaScript και Frameworks”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες