Also habe ich dieses jqueryui-Widget erstellt. Es erstellt ein Div, in das ich Fehler streamen kann. Der Widget-Code sieht folgendermaßen aus:

$.widget('ui.miniErrorLog', {
   logStart: "<ul>",   // these next 4 elements are actually a bunch more complicated.
   logEnd:   "</ul>",
   errStart: "<li>",
   errEnd:   "</li>",
   content:  "",
   refs:     [],

   _create: function() { $(this.element).addClass( "ui-state-error" ).hide(); },

   clear: function() { 
      this.content = ""; 
      for ( var i in this.refs )
         $( this.refs[i] ).removeClass( "ui-state-error" );
      this.refs = [];
      $(this.element).empty().hide(); 
   }, 

   addError: function( msg, ref ) {
      this.content += this.errStart + msg + this.errEnd; 
      if ( ref ) {
         if ( ref instanceof Array )
            this.refs.concat( ref );
         else
            this.refs.push( ref );
         for ( var i in this.refs )
            $( this.refs[i] ).addClass( "ui-state-error" );
      }
      $(this.element).html( this.logStart + this.content + this.logEnd ).show();
   }, 

   hasError: function()
   {
      if ( this.refs.length )
         return true;
      return false;
   },
});

Ich kann Fehlermeldungen hinzufügen und Verweise auf Seitenelemente, die in einen Fehlerzustand versetzt werden. Ich benutze es, um Dialoge zu validieren. In der "addError" -Methode kann ich eine einzelne ID oder ein Array von IDs wie folgt übergeben:

$( "#registerDialogError" ).miniErrorLog( 
   'addError', 
   "Your passwords don't match.", 
   [ "#registerDialogPassword1", "#registerDialogPassword2" ] );

Aber wenn ich eine Reihe von IDs übergebe, funktioniert das nicht. Das Problem liegt in den folgenden Zeilen (glaube ich):

if ( ref instanceof Array )
   this.refs.concat( ref );
else
   this.refs.push( ref );

Warum funktioniert das nicht? this.refs und ref sind beide Arrays. Warum funktioniert das Concat nicht?

Bonus: Mache ich noch etwas Dummes in diesem Widget? Es ist mein erster.

99
Rafael Baptista 9 Okt. 2012 im 19:37

4 Antworten

Beste Antwort

Die concat-Methode ändert das ursprüngliche Array nicht, Sie müssen es neu zuweisen.

if ( ref instanceof Array )
   this.refs = this.refs.concat( ref );
else
   this.refs.push( ref );
231
Rocket Hazmat 9 Okt. 2012 im 15:40

Hier ist der Grund warum:

Definition und Verwendung

Die concat () -Methode wird verwendet, um zwei oder mehr Arrays zu verbinden.

Diese Methode ändert die vorhandenen Arrays nicht, sondern gibt ein neues Array zurück, das die Werte der verknüpften Arrays enthält.

Sie müssen das Ergebnis der Verkettung wieder in Ihrem Array zuweisen.

72
Konstantin Dinev 9 Okt. 2012 im 15:42
dataArray = dataArray.concat(array2)
0
double-beep 14 Juli 2019 im 12:41

Um Konstantin Dinev zu erweitern:

.concat() wird nicht zum aktuellen Objekt hinzugefügt, daher funktioniert dies nicht :

foo.bar.concat(otherArray);

Dieser Wille:

foo.bar = foo.bar.concat(otherArray);
4
mewc 3 Okt. 2019 im 01:33