2017-08-21 5 views
0

Ich möchte einfach ein Element zu einer Liste irgendwo in meinem unveränderlichen Objektbaum hinzufügen.Hinzufügen eines einzelnen Elements zu einer unveränderlichen Liste

Diese Frage erscheint hier beantwortet zu haben:

Append value to List

Aber aus irgendeinem Grund ist es nicht für mich arbeiten.

Wenn ich den folgenden Code haben:

var myState = { 
    a: { 
    b: { 
     c: [ 
     {name: 'hi', value: 2}, 
     {name: 'howdy', value: 3} 
     ] 
    } 
    } 
} 
myState = Immutable.fromJS(myState); 
myState = myState.update(['a', 'b', 'c'], function (myList) { 
    myList.push({"name": "hallo", "value": 4}) 
    } 
); 

Ich erhalte eine Fehlermeldung:

Uncaught TypeError: Cannot read property 'push' of undefined

, die anzeigt, dass der myList Parameter in den Rückruf übergeben wird null ist.

Warum passiert das?

Geige:

https://codepen.io/owatkins/pen/brMava

+0

Mögliche Duplikate von [Wie aktualisiere Element in Liste mit ImmutableJS?] (Https://StackOverflow.com/questions/29589753/How-to-Update-Element-inside-list-with-immutablejs) –

+1

Überprüfen Sie meine Antwort https://stackoverflow.com/a/39788499/3507464 –

+1

fast, Ihr Beispiel beschäftigt sich mit der Aktualisierung von etwas in einem Element in einem Array. Ich möchte nur ein Element zu einem Array hinzufügen. –

Antwort

1

Dies ist, wie es geschrieben werden soll:

myState.updateIn(['a', 'b', 'c'], function (myList) { 
    return myList.push({"name": "hallo", "value": 4}) 
    } 
); 

Im Folgenden ein funktionierendes Beispiel ist:

var myState = Immutable.fromJS({ 
 
    a: { 
 
    b: { 
 
     c: [{ 
 
      name: 'hi', 
 
      value: 2 
 
     }, 
 
     { 
 
      name: 'howdy', 
 
      value: 3 
 
     } 
 
     ] 
 
    } 
 
    } 
 
}) 
 

 
myState = myState.updateIn(['a', 'b', 'c'], function(myList) { 
 
    return myList.push({ 
 
    "name": "hallo", 
 
    "value": 4 
 
    }) 
 
}); 
 

 
console.info('myState = ' + myState.toJS())
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.1/immutable.min.js"></script>

Hinweis, dass ich updateIn statt update und Rückkehr das Ergebnis push

+0

Entschuldigung, funktioniert nicht für mich. myList ist auch hier nicht definiert. –

+0

hat ein funktionierendes Beispiel für diesen Code hinzugefügt – thedude

-1

Nach viel Füllung um verwenden, ich die einzige Lösung könnte kommen mit ist das Array zu erhalten, und zu JS konvertieren, drücken Sie ein Element darauf, dann wandeln Sie es wieder in ein unveränderliches ... und dann verwenden Sie setIn, NICHT updateIn, und nicht update.

var myState = { 
    a: { 
    b: { 
     c: [ 
     {name: 'hi', value: 2}, 
     {name: 'howdy', value: 3} 
     ] 
    } 
    } 
} 
myState = Immutable.fromJS(myState); 

var list = myState.getIn(['a', 'b', 'c']) 
var list = list.toJS(); 

list.push({"name": "hallo", "value": 4}); 

var v = Immutable.fromJS(list) 

myState = myState.setIn(['a', 'b', 'c'], v) 

Das sieht wie eine schreckliche Lösung, aber es ist das einzige, was bisher für mich funktioniert.

Normalerweise dauert es ungefähr 5 Minuten, um zu lernen, wie man ein Element zu einer Liste in einem Framework oder einer Sprache hinzufügt.

erwartete ich es nicht 5 STUNDEN zu nehmen.

Die Dokumentation für dieses Framework ist eine absolute Schande.

Verwandte Themen