116

そこで、このjqueryuiウィジェットを作成しました。エラーをストリーミングできるdivが作成されます。ウィジェットコードは次のようになります。

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

エラーメッセージを追加したり、エラー状態になるページ要素への参照を追加したりできます。ダイアログを検証するために使用します。「addError」メソッドでは、次のように単一のIDまたはIDの配列を渡すことができます。

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

しかし、idの配列を渡すと、機能しません。問題は次の行にあります(私は思います):

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

なぜその連結が機能しないのですか。this.refsとrefはどちらも配列です。では、なぜコンキャットが機能しないのですか?

ボーナス:私はこのウィジェットで他に何か馬鹿げたことをしていますか?それは私の最初のものです。

4

6 に答える 6

320

concatメソッドは元の配列を変更しないため、再割り当てする必要があります。

if ( ref instanceof Array )
   this.refs = this.refs.concat( ref );
else
   this.refs.push( ref );
于 2012-10-09T15:39:18.200 に答える
87

理由は次のとおりです。

定義と使用法

concat()メソッドは、2つ以上の配列を結合するために使用されます。

このメソッドは既存の配列を変更しませんが、結合された配列の値を含む新しい配列を返します。

連結の結果を、使用している配列に割り当てる必要があります。

于 2012-10-09T15:42:20.760 に答える
19

Konstantin Dinevを拡張するには:

.concat()現在のオブジェクトに追加されないため、これは機能しませ

foo.bar.concat(otherArray);

この意志:

foo.bar = foo.bar.concat(otherArray);
于 2019-03-27T01:40:05.833 に答える
12

連結値を取得するために、=を使用して値を配列に再割り当てする必要があります

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);

于 2020-04-15T16:26:30.643 に答える
2
dataArray = dataArray.concat(array2)
于 2019-07-14T12:34:29.003 に答える
0

concat関数を使用するときに本当に可変配列が必要な場合(可変とは、新しい配列を作成せずに既存の配列を変更することを意味します)、その配列インスタンスにconcat関数を再割り当てできます。これが必要なときにやったことがあります。

let myArray = [];

myArray.concat= function(  toAdd){
     if(Array.isArray(toAdd)){
        for(let node of toAdd)
             this.push(node);
      }else
        this.push(toAdd);
}
于 2021-08-06T22:41:18.903 に答える