Ich verwende die folgenden Knockout-Skripte in meinem HTML:
<!-- kno ifnot: bla -->
<tr><td>some stuff</td></tr>
<!-- /ko -->
Das Problem, das ich habe, ist, dass diese Zeile vor dem Ausführen der Bindungen für ein oder zwei Sekunden angezeigt wird.
Wie kann ich dies verhindern?
knockout.js
shenku
quelle
quelle
d-none
.display: none
. (Hintergrund: Ausblenden des Elements über Klassenstil nicht funktioniert , da Knockout entfernt dasdisplay
. Stil Inline wenn macht das Element sichtbar über die Bindung Dann wird Ihr Klassenstil übernehmen und das Element verbergen für immer.)Da das gewünschte Verhalten häufig von Seite zu Seite unterschiedlich ist, mache ich dies in meiner Layout- / Vorlagendatei (ASP.NET).
<div class="ko-unbound" data-bind="css: { 'ko-unbound': false, 'ko-bound': true }"> @RenderBody() </div>
Wenn die Seite gebunden ist:
ko-unbound
Klasse wird von der Seite entfernt (anfänglich mitclass
Attribut hinzugefügt ).ko-bound
Klasse wird der Seite hinzugefügt.Dann kann ich auf einer Seite, auf der unerwünschter Inhalt ein Problem darstellt, das CSS anpassen, um Dinge basierend auf diesen beiden Klassen ein- oder auszublenden. Ich verwende diese Technik auch, um ein Ladebild anzuzeigen oder einem Element eine Mindesthöhe aufzuerlegen.
.ko-unbound #storeWizard { display: none; // hide entire section when the page is binding } .ko-bound #loadingGraphic { display: none; // hide loading graphic after page is bound }
Während des Testens füge ich beim Anwenden von Bindungen eine Zeitüberschreitung hinzu, damit ich den Blitz sehen kann.
setTimeout(function () { ko.applyBindings(RR.VM); }, 300);
quelle
Wickeln Sie Ihr HTML in so etwas ein -
<div id="hideme" style="display:none"> </div>
Fügen Sie dann in Ihrem JavaScript die folgende jquery-Zeile hinzu, nachdem Sie die Bindung angewendet haben -
$('#hideme').show();
Dies ist die einfachste Methode, die ich gefunden habe und die funktioniert. Sie könnten dies mit einigen Knockout-Bindungen tun, verlieren jedoch das garantierte Timing, da Sie nicht steuern können, ob Auftragsbindungen ausgeführt werden.
quelle
Eine andere Lösung, die ich hier gefunden habe
<div id="binding-start" style="visibility:hidden" data-bind="attr: { 'style': 'visibility:visible' }" />
Dies hat den Vorteil - oder Nachteil, je nach Ihren Anforderungen -, dass Platz für den versteckten Inhalt reserviert wird. Die Seite "springt" nicht, wenn die Bindungen angewendet werden.
quelle