2016-04-18 12 views
0

データテーブルの並べ替えボタンをビルドしているうちに、これが表示されました。私は、各ソート・ボタンを、DESC(ソート・ダウン)とASC(ソート・アップ)と非アクティブ(デフォルトのソート)の間で切り替えたいと思っていました。Javascriptオブジェクトの割り当てgottcha

だから私は、1つのプログラムが進行し、1だからあなたはそれがすべてのように動作していることがわかります値

var model = { 
 
    order: { 
 
    field: 'creationDate', 
 
    direction: 'DESC' 
 
    }, 
 
    orderDefault: { 
 
    field: 'creationDate', 
 
    direction: 'DESC' 
 
    } 
 
} 
 

 
$('button').click(function() { 
 
    if (model.order.field == "creationDate") { 
 
    model.order.field = 'newField' 
 
    } else if (model.order.direction == 'DESC') { 
 
    model.order.direction = 'ASC' 
 
    } else { 
 
// This casuses the orderDefault object to be a clone of the order object 
 
// so assignment of values in model.order are refelected in model.orderDefault GOTCHA!!!! 
 
    model.order = model.orderDefault 
 
    } 
 
    $('#result').html('field:' + model.order.field + " direction:" + model.order.direction); 
 
} 
 
)
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet"/> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> 
 
<button class="btn btn-primary"> 
 
    click me 
 
</button> 
 

 
<div id="result"> 
 

 
</div>
をリセットするには、デフォルトあったように変更1になる予定だった二つのモデルを作成しました注文オブジェクトをリセットするまで予想されます。コード内のこの点にもう一度着くと、決してリセットされないことがわかります。 orderDefault objがorder objのエイリアスになるようです。

+0

これは、オブジェクトがJavaScriptで参照によって割り当てられている、つまり割り当て時にコピーされないためです。私が知る限り、普及しているプログラミング言語の中では非常に一般的な動作です。 –

答えて

0

答えではなくorderDefault割り当てるので、あなたが、私はこれが誰かの役に立てば幸いそうではない

model.order = model.orderDefault 

しかし

model.order.direction = model.orderDefault.direction 
model.order.field = model.orderDefault.field 

orderDefault

の値を代入する必要があるということです。

+0

プラットフォームがサポートしている場合は、 'Object.assign(model.order、model.orderDefault)'を使用できます。 –

+0

はい、私はそれを見たことがなかった、ありがとう、良いソリューションのように見えるように古いブラウザのためのpolyfillがあります。私が興味深いのは、 '='を使った割り当ては、実際に代入ではなく、同等のアサーションであるということです。したがって、オブジェクトAのプロパティxを変更すると、オブジェクトBのプロパティxが変更されます。 – Richard

+0

実際には、オブジェクトの値ではなく、オブジェクトへの参照の割り当てです。 'model.order = model.orderDefault'は' 'name *' model.order'を '' model.orderDefault'の* value *を指していることを意味するので、両方の名前が同じオブジェクトを指すようになりました。その後、A. Java、Pythonなどの多くの言語が同じように動作します。 –

関連する問題