2012-10-09 19 views
40

Así que he creado este widget jqueryui. Esto crea un div en el que puedo transmitir errores. El código del widget se ve así:Javascript Array Concat no funciona. ¿Por qué?

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

puedo agregar mensajes de error en ella, y las referencias a elementos de la página que se va a poner en un estado de error. Lo uso para validar diálogos. En el método "addError" me puede pasar en una sola identificación, o una tabla de id, así:

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

Pero cuando paso en una serie de identificadores no funciona. El problema está en las siguientes líneas (creo):

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

¿Por qué no funciona? this.refs y ref son ambas matrices. Entonces, ¿por qué no funciona el concat?

Bonificación: ¿estoy haciendo algo más tonto en este widget? Es mi primera.

Respuesta

111

El método concat no cambia la matriz original, necesita reasignarla.

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

Eso lo hizo. Hubiera pensado que un método concat en un objeto se agregaría al objeto. Pero supongo que no es así como funciona. –

+2

@Rafael: El método 'push' hace eso, puedes hacer' [] .push.apply (this.refs, ref) ' – Bergi

32

Aquí es la razón por la cual: se utiliza el método

definición y el uso

El concat() para unir dos o más matrices.

Este método no cambia las matrices existentes, pero devuelve una nueva matriz , que contiene los valores de las matrices unidas.

Debe volver a asignar el resultado de la concatenación en la matriz que tiene.

Cuestiones relacionadas