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.
4 Antworten
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 );
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.
dataArray = dataArray.concat(array2)
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);