2016-04-04 10 views
0

Ich habe eine Liste der Elemente mit Eisen-Liste aufgeführt. Die Artikel in der Eisenliste sind erweiterbar, für jeden Artikel gibt es eine Ausgabeform.Polymer Eisen-Liste Artikel in der Liste hinzufügen und wählen Sie den neu hinzugefügten Artikel

Es besteht auch die Möglichkeit, einen neuen Eintrag zu erstellen, indem Sie auf eine allgemeine Schaltfläche "Hinzufügen" klicken. Dann wird ein neues Element mit der Methode this.push ('items', newItem) zur Liste hinzugefügt.

Der Druck des neuen Artikels funktioniert gut, die Liste wird aktualisiert.

Ich möchte, dass nach dem Drücken eines neuen Elements das Formular entsprechend dem Element sofort erweitert werden. Wenn der Benutzer also ein neues Objekt erstellen möchte, wird das Erstellungsformular sofort angezeigt.

Um das Formular für ein Element zu erweitern, greife ich einfach den Index der Eisen-Liste aus dem DOM (Element 0 Index 0, Element 1, Index 1 ...), dann füge ich eine CSS-Klasse, die wird es ausweiten.

Das Problem, das ich habe, ist, dass zwischen dem Drücken des Elements und dem Aufruf der Methode, die das Element erweitern wird, das DOM noch nicht gerendert wird, so dass es keinen Index in der Eisenliste entsprechend neu gibt erstellter Artikel

Gibt es einen Teil des Lebenszyklus des Elements, den ich verpasst habe? Nach der Forschung habe ich keine Methoden gefunden, um das Rendern der Eisenliste oder der Aktualisierung zu erzwingen ... Könnte mir jemand eine Idee geben, wie man das Formular sofort ausfüllt, nachdem ich das Objekt in das Array geschoben habe?

+0

Fügen Sie bitte einen Code hinzu, der zeigt, was Sie zu erreichen versuchen und das es ermöglicht, Ihr Problem zu reproduzieren. –

+0

Hi Gunter, der Cody ist ziemlich kompliziert zu reproduzieren ... Grundsätzlich würde ich gerne wissen, ob es eine Möglichkeit gibt, auf das Rendering des DOM zu warten, um dann ein Mausklick-Ereignis auszulösen – gabriela

+0

Wenn es zu kompliziert ist, es hinzuzufügen Auf die Frage ist es noch viel komplizierter für Leute, die Ihre Frage lesen, um darüber nachzudenken, besonders ohne Ihren Code zu sehen. Versuchen Sie, es auf ein einfaches Beispiel zu reduzieren, das zu Ihrer Frage passt. Ich verstehe auch nicht, was Sie meinen, indem Sie "auf das Rendering des DOM warten und dann ein Mausklick-Ereignis auslösen". –

Antwort

0

Dieser Code wird immer dann erweitert, wenn die erweiterte Variable der ID entspricht, eindeutige IDs erfordert, Name oder was auch immer sein kann (ich würde empfehlen, die Datenbank zu verwenden). Erweitert das Objekt automatisch, indem expanded gleich der ID des zuletzt erstellten Objekts gesetzt wird.

<dom-module id="my-list"> 
    <template> 
    <iron-list items="{{myItems}}"> 
     <my-item 
      on-tap="select" 
      expaned="[[areEqual(item.id, expanded]]"> 
      [[item.name]] 
     </my-item> 
    </iron-list> 
     .... add stuff .... 
    </template> 
</dom-module> 
<script> 
    (function() { 
    Polymer({ 
     is: 'my-list', 

     properties: { 
      expanded: { 
      type: string, 
      value: "" 
      } 
     }, 
     onAdd: function(adding){ 
     ... adding code... 
     this.expanded = this.adding.id; 
     }, 

     areEqual: function(a, b){ 
     return a === b; 
     }, 

     select: function(e){ 
     this.expanded = e.model.id; 
     } 
     }) 
    }()) 
</scipt> 
+0

Vielen Dank ShaBANG für Ihre Antwort. Ich benutzte die ID, um die Elemente zu erweitern, aber meine Liste hat mehr als 1000 Elemente. Wenn iron-list die Liste erstellt, erstellt es 20 Elemente (20 IDs), die beim Scrollen in der Liste wiederverwendet werden. Also, wenn ich am Ende der Liste scrollen (Element 1000 mit ID aus Datenbank 1000) und versuchen, es mit der ID zu erweitern, würde es nicht funktionieren, weil Eisen-Liste für ID 19 und nicht 1000 verlangt. Ich fand a Lösung im Demo-Quelltext der Iron-List in Datei selection.html. Dort, für die Auswahl eines Elements anstelle der ID verwenden sie e.model.item. Das löste mein Problem :) – gabriela

Verwandte Themen