Stworzyłem więc ten widget jqueryui. Tworzy div, do którego mogę przesyłać błędy. Kod widżetu wygląda następująco:
$.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 i odniesienia do elementów strony, które zostaną wprowadzone w stan błędu. Używam go do weryfikacji okien dialogowych. W metodzie „addError” mogę przekazać pojedynczy identyfikator lub tablicę identyfikatorów, na przykład:
$( "#registerDialogError" ).miniErrorLog(
'addError',
"Your passwords don't match.",
[ "#registerDialogPassword1", "#registerDialogPassword2" ] );
Ale kiedy przekazuję tablicę identyfikatorów, to nie działa. Problem jest w następujących wierszach (myślę):
if ( ref instanceof Array )
this.refs.concat( ref );
else
this.refs.push( ref );
Dlaczego to nie działa. this.refs i ref są zarówno tablicami. Dlaczego więc konkat nie działa?
Bonus: czy robię coś głupiego w tym widżecie? To moja pierwsza.
javascript
jquery
jquery-ui
Rafael Baptista
źródło
źródło
Odpowiedzi:
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 );
źródło
push
Metoda to robi, możesz to zrobić[].push.apply(this.refs, ref)
Oto powód, dla którego:
Musisz przypisać wynik konkatenacji z powrotem do posiadanej tablicy.
źródło
Aby rozwinąć Konstantin Dinev:
.concat()
nie dodaje się do bieżącego obiektu, więc to nie zadziała:To będzie:
źródło
musisz ponownie przypisać wartość za pomocą = do tablicy, którą chcesz uzyskać określoną wartość
let array1=[1,2,3,4]; let array2=[5,6,7,8]; array1.concat(array2); console.log('NOT WORK : array1.concat(array2); =>',array1); array1= array1.concat(array2); console.log('WORKING : array1 = array1.concat(array2); =>',array1);
źródło
źródło