2013-02-21 9 views
12

Ich weiß nicht, ob du diese Demo-App schon gesehen hast: http://www.johnpapa.net/hottowel/ aber sobald du es startest, siehst du einen wirklich schönen Ladebildschirm am Anfang wie in jedem größeren Desktop-Anwendung/Spiel.emberjs "loading screen" am Anfang

So hatte ich nicht die Chance, den Code selbst richtig durchzugehen, aber ich habe kürzlich mit Emberjs angefangen und ich habe das Gefühl, dass ich den ganzen js-Code für das ganze SPA laden könnte der Sekundenbereich.

Meine Frage jetzt, wie wäre solch ein Ladebildschirm mit Emberjs möglich? Oder wäre da ein besserer Weg? (Ich glaube irgendwie nicht requirejs eine Lösung wäre, wenn ich falsch sein könnte)

Antwort

12

Sie etwas tun können:

App = Ember.Application.create({ 
    ready: function() { 
    $("#loader").remove(); 
    } 
}); 

in Ihrem Körper setzen Sie so etwas wie diese

<img src="img/loading.gif" id="loader"> 
+0

nicht die Zeit hatten, noch zu testen, aber dies scheint als würde es den Job machen. Prost. – Markus

19

Ich möchte eine alternative Antwort dazu beitragen. Standardmäßig wird ready ausgelöst, wenn das DOM bereit ist, und es kann einige Zeit dauern, Ihre Anwendung danach zu rendern, was (möglicherweise) einige Sekunden zu einer leeren Seite führt. Für meine Anwendung war die Verwendung der didInsertElement auf ApplicationView die beste Lösung.

Beispiel:

App.ApplicationView = Ember.View.extend({ 
    didInsertElement: function() { 
    $("#loading").remove(); 
    } 
}); 

Bitte beachten Sie, dass Ember bietet auch die Möglichkeit, Anwendungsreife zu verschieben, siehe the code für weitere Informationen.

+0

Link zu deferReadiness() Code war großartig, danke! – mbfisher

14

Vielleicht ist es meine faule Weise, Dinge zu tun, aber ich gelöst gerade dies durch Hinzufügen einer no-ember Klasse meiner div.loading und in meinem CSS habe ich

.ember-application .no-ember { 
    display: none; 
} 

(Ember fügt automatisch die ember-application zum body.)

Auf diese Weise können Sie auch CSS3-Animationen hinzufügen, um vom Ladebildschirm wegzugehen.

+0

Großartig, schön, fantastisch, fantastisch, wunderbar! (muss ich erwähnen, ich habe es einfach so gemacht und es funktioniert schön :)) – rollingBalls

+0

beeindruckend..ein einfacher Weg, etwas ohne den ganzen Stress zu erreichen .. :) – kweku360

+0

Funktioniert schön und ist schnell und einfach, aber zumindest für meine Es gibt immer noch eine Verzögerung, wenn die 'ember-application' Klasse hinzugefügt wird und die Vorlagen tatsächlich gerendert werden, so dass Sie immer noch einen leeren Bildschirm bekommen (obwohl es jetzt kürzer ist) – Sarus

2

Ember hat eine automatische Ladelogik.

Durch einfaches Festlegen von App.LoadingView und seiner Vorlage zeigt Ember diese Ansicht an, während die Anwendung geladen wird.

Diese Funktion wird sich wahrscheinlich in der nächsten Version zugunsten einer verschachtelten Loading-Route-Funktion ändern, die vielversprechend aussieht. Siehe unten:

Draft documentation

Feature proposal and discussion

+1

Das ist wirklich nützlich zu wissen, und besonders danke für das Putten Die Links in. Nach dem Lesen der Dokumente und der Diskussion sieht es jedoch so aus, als ob die neue Logik (und vermutlich die ältere App.LoadingView) eine Ladevorlage während Übergängen zwischen Routen anzeigt, dh sobald die Anwendung bereits geladen wurde. Die Frage impliziert die Notwendigkeit eines Ladebildschirms, bevor die Anwendung geladen wurde. – pjmorse

6

Alternative didInsertElement zu verwenden, die willInsertElement ein besseres Ereignis ist die Laden div Entfernung durchzuführen, da es aus dem Body-Tag entfernt werden „bevor“ die Anwendungsvorlage ist gerendert darin und eliminiert den "Flimmereffekt" (es sei denn, es wird eine absolute Positionierung des Lade-Div verwendet).

Beispiel:

App.ApplicationView = Ember.View.extend({ 
    willInsertElement: function() { 
     $("#loading").remove(); 
    } 
}); 
+1

bitte wo stelle ich diesen Code in ember 2.0 .. Ich bin ein Neuling .. danke – kweku360

1

In Ember 2.0 gibt es nicht mehr View-Schicht, aber Sie können das gleiche mit initializers tun:

App.initializer({ 
    name: 'splash-screen-remover', 
    initialize: function(application) { 
    $('#loading').remove(); 
    }, 
}); 
Verwandte Themen