2012-10-09 9 views
40

Also habe ich dieses jqueryui Widget erstellt. Es erzeugt ein Div, in das ich Fehler streamen kann. Der Widget-Code sieht wie folgt aus:Javascript Array Concat funktioniert nicht. Warum?

$.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 Fehlermeldungen in sie hinzufügen können, und Verweise auf Seitenelemente, die einen Fehlerzustand versetzt wird, wird in. Ich benutze es um Dialoge zu validieren. In der „addError“ Methode kann ich in einer einzigen ID übergeben oder eine Anordnung von ids, wie folgt aus:

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

Aber wenn ich in einer Reihe von ids passieren funktioniert es nicht. Das Problem ist in den folgenden Zeilen (ich denke):

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

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

Bonus: mache ich noch etwas dummes in diesem Widget? Es ist meine erste.

Antwort

111

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

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

Das hat es getan. Ich hätte gedacht, dass eine Concat-Methode für ein Objekt an das Objekt anhängen würde. Aber ich denke, so funktioniert es nicht. –

+2

@Rafael: Die 'push' Methode macht das, du könntest' [] .push.apply (this.refs, ref) ' – Bergi

32

ist der Grund, warum:

Definition und Verwendung

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

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

Sie müssen das Ergebnis der Verkettung zurück in dem Array zuweisen, die Sie haben.

Verwandte Themen