2012-10-09 13 views
40

Więc stworzyłem ten widget jqueryui. Tworzy div, do którego mogę przesyłać błędy. Kod widgetu wygląda następująco:Javascript Array Concat nie działa. Czemu?

$.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; 
    }, 
}); 

Mogę dodać do niego komunikaty o błędach oraz odniesienia do elementów strony, które zostaną wprowadzone w stan błędu. Używam go do sprawdzania okien dialogowych. W „addError” metody mogę przekazać w jednym ID, lub tablicę identyfikatorów, takich jak to:

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

Ale kiedy przechodzą w tablicy identyfikatorów nie działa. Problem jest w następujących liniach (myślę):

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

Dlaczego ta concat nie działa. this.refs i ref są obydwoma tablicami. Dlaczego więc concat nie działa?

Bonus: Czy robię cokolwiek innego głupiego w tym widżecie? To moja pierwsza.

Odpowiedz

111

Metoda concat nie zmienia oryginalnej tablicy, musisz ją ponownie przypisać.

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

To się udało. Pomyślałbym, że metoda concat na obiekcie zostanie dołączona do obiektu. Ale myślę, że to nie tak działa. –

+2

@Rafael: Metoda 'push' robi to, możesz zrobić' [] .push.apply (this.refs, ref) ' – Bergi

32

Oto powód: metoda

Definicja i Wykorzystanie

concat() służy do łączenia dwóch lub więcej tablic.

Ta metoda nie zmienia istniejących tablic, ale zwraca nową tablicę zawierającą wartości połączonych tablic.

Musisz przypisać wynik konkatenacji z powrotem do tablicy, którą posiadasz.