Ich habe eine Vorlage, die zu meist gleichwertig ist:Wie zu zwingen, angewandt Meteors Blaze zu Änderungen im Batch-Block #each
<div class="line">
{{#each part in line}}
<span class="part">{part}</span>
{{/each}}
</div>
wo die line: string[]
ist eine Partition von einer einzigen Zeile in einem oder mehr Teile. Das Problem ist, dass, wenn sich der Inhalt von line
ändert, die Vorlage versucht, alte Elemente mit neuen Elementen abzugleichen (was in Ordnung ist) und Änderungen einzeln auf das DOM anwendet (was nicht in Ordnung ist). Insbesondere wenn der alte Wert line
["Hello","world"]
war und der neue ["Hello world"]
ist, dann gibt es einen kurzen Zeitraum, in dem dem Benutzer ein neuer Wert von line[0]
kombiniert mit dem alten Wert line[1]
, der ["Hello world","world"]
ist, präsentiert wird. Meistens wird dies unbemerkt, aber wenn die Teile im Vergleich zur Bildschirmbreite lang genug sind, kann es vorkommen, dass <span class="part">Hello world</span><span class="part">world</span>
nicht in eine Zeile passt, was wiederum bewirkt, dass der ganze weitere Inhalt um eine Zeile nach unten verschoben wird , nur um später wieder eine Zeile höher verschoben zu werden, wenn line[1]
endgültig entfernt wird.
Eine Lösung, die ich derzeit verwende, ist das Ersetzen der gesamten #each
Schleife mit benutzerdefinierten Helfer {{{ helpMeRenderThisLine line }}}
, die die HTML-Zeichenfolge manuell erstellt, aber das verstößt offensichtlich Trennung der Bedenken und meine Code-Stil.
Ich bin neu zu Meteor, aber diese sind die Richtungen würde ich gerne genauer untersuchen:
- Gibt es eine Möglichkeit, eine Schleife nicht-reaktiv zu machen? Ich habe gehört, es gab etwas wie
#constant
Block, aber es wird nicht mehr unterstützt. - Gibt es eine Möglichkeit, den gesamten Aktualisierungsprozess in einen einzelnen DOM Reflow zu "batch"?
- Gibt es eine Möglichkeit, das Impulspaket zu verwenden, um das Flimmern zu entfernen?
- Gibt es eine Möglichkeit, eine kleinere Blaze-Vorlage zu verwenden, um die Einzelzeile nicht reaktiv zu machen?
Ich sehe, dass ich nicht spezifisch genug war. In meinem Fall ist myStrings bereits ein einfaches Array. Das Problem ist, dass Blaze, wenn ich es gegen ein anderes Array tausche, alte Elemente mit neuen Elementen vergleicht und sie einzeln aktualisiert, wobei alle Zwischenzustände für den Benutzer sichtbar sind. Ich möchte diesen Prozess dazu zwingen, den gesamten alten DOM-Teilbaum durch den neuen Teilbaum in einer einzigen atomaren Operation zu ersetzen. Dies hatte ich bei der Verwendung des Ausdrucks "nicht reaktiv" im Sinn. – qbolec