2016-04-18 7 views
0

Ich stieß auf diese beim Erstellen von Sortierschaltflächen für eine Datentabelle. Ich wollte jede Sortierschaltfläche haben, um zwischen einem DESC (Sortieren nach unten) und ASC (Sortieren nach oben) und inaktiv - der Standardsortierung umzuschalten. SoJavascript Object Assignment gottcha

Ich habe zwei Modelle ein derjenige sein würde, der als das Programm geändert Fortschritte gemacht und war ein Standard die Werte

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>
So zurückgesetzt werden Sie sehen, dass alles funktioniert wie erwartet bis zu dem Punkt, an dem wir das Auftragsobjekt zurücksetzen. Beim zweiten Mal, wenn wir an diesen Punkt im Code kommen, werden Sie sehen, dass er nie zurückgesetzt wird. Es scheint, dass das Objekt orderDefault zu einem Alias ​​von order obj wird.

+0

Dies liegt daran, dass Objekte per Referenz in JavaScript zugewiesen werden, d. H. Sie werden bei der Zuweisung nicht kopiert. Es ist ein weit verbreitetes Verhalten unter den bekannten Programmiersprachen, soweit ich weiß. –

Antwort

0

die Antwort ist, dass anstelle der Zuweisung orderDefault Sie die Werte von orderDefault

so NICHT

model.order = model.orderDefault 

ABER

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

Ich hoffe, das hilft jemand zuweisen müssen.

+0

Wenn Ihre Plattform dies unterstützt, können Sie 'Object.assign (model.order, model.orderDefault)' verwenden. –

+0

Ja, ich hatte das nicht gesehen, danke, und es gibt ein Polyfill für ältere Browser, so dass es wie eine gute Lösung aussieht. Was ich interessant fand, ist, dass die Zuweisung, die '=' verwendet, nicht wirklich eine Aufgabe, sondern eine Behauptung der Äquivalenz ist. Wenn Sie also die Eigenschaft x in Objekt A geändert haben, würde das die Eigenschaft x in Objekt B ändern. – Richard

+0

Es handelt sich eigentlich um eine Zuweisung des Verweises auf das Objekt anstelle des Werts des Objekts. 'model.order = model.orderDefault' bedeutet" der * Name * 'model.order' jetzt * zeigt auf * den * Wert * von' model.orderDefault' ", so dass beide Namen jetzt auf das gleiche Objekt zeigen. Es gibt kein A und B danach, nur A. Java, Python und viele andere Sprachen verhalten sich gleich. –