Turbolinks und Controller-spezifische Assets

8

Ich habe application.html.erb geändert, um Controller-spezifische Assets zu verwenden:

application.html.erb :

%Vor%

Das Problem ist, dass ich Turbolinks installiert habe. Wenn ich durch denselben Controller navigiere, funktioniert Turbolinks. Aber wenn ich zu einem anderen Controller umschalte, werden die Turbolinks einen vollständigen Nachladevorgang durchführen. Gibt es eine Möglichkeit, das zu beheben?

    
Sarun Intaralawan 12.07.2014, 06:24
quelle

2 Antworten

12

Turbolinks

Turbolinks nimmt die <body> Ihrer HTML-Seite und ändert sie mit Ajax, wobei der Bereich <head> intakt bleibt.

Dieses only funktioniert nur, wenn Ihr <head> gleich bleibt - sonst wie kann es konstant gehalten werden? In dem Sinne, dass Sie Ihre Controller-Seite / Assets ändern, werden Sie haben , um ein vollständiges Seiten-Update ohne Turbolinks zu durchlaufen (zumindest wenn Sie Turbolinks verwenden, ohne es zu hacken)

Ich würde empfehlen, das Problem zu beheben, indem Sie Ihre Controller-spezifische Asset-Struktur ändern, um so wenige Änderungen am <head> -Bereich wie möglich vorzunehmen.

-

Turbolinks Tracking

Wenn Sie die Turbolinks documentation gelesen haben, können Sie möglicherweise davon profitieren, die turbolinks-data-track zu entfernen. Option aus Ihren Controller-spezifischen Assets:

%Vor%
  

Sie können bestimmte Assets wie application.js und application.css verfolgen.   das du sicherstellen willst, sind immer von der neuesten Version innerhalb eines   Turbolinks Sitzung. Dies geschieht durch Markieren dieser Asset-Links mit   Daten-Turbolinks-Track, so:

     

<link href="/assets/application-9bd64a86adb3cd9ab3b16e9dca67a33a.css" rel="stylesheet" type="text/css" data-turbolinks-track>

     

Wenn diese Assets URLs ändern (betten Sie einen MD5-Stempel ein, um dies zu gewährleisten), wird die Seite vollständig ausgeführt   Nachladen statt Turbolinks. Dies gewährleistet, dass alle   Bei Turbolinks-Sitzungen wird immer das neueste JavaScript ausgeführt   und CSS.

-

Steuerungsname

Etwas, von dem Sie profitieren werden, ist die Verwendung des Helpers controller_name (anstelle von params[:controller] ):

%Vor%     
Richard Peck 12.07.2014, 06:40
quelle
3

Setzen Sie Ihren Controller spezifische js in das body-Tag. Da Turbolinks den HTML-Text nicht berühren, laden Sie diesen js-Code bei jedem Aufruf der Seite neu.

In Ihrem Fall

%Vor%

Aber wenn Sie viel Code in Ihrem Controller js haben, stellen Sie vielleicht fest, dass die obige Lösung ziemlich zeitaufwendig ist. Denn wenn Sie die Seite besuchen, wird dieser große Teil des Codes neu geladen. So, wie man damit umgeht?

■ Die folgende Methode kann dazu führen, dass einige der jquery-Ereignisse mehrfach gebunden werden. Dies ist ein Problem der Turbolinks. Lesen Sie diesen Artikel Ссылка

Eine effektivere Lösung

Wenn der Benutzer zum ersten Mal Ihre Site besucht, lädt er den gesamten js-Code, stellt sicher, dass Controller-spezifische nicht ausgeführt werden (umbrechen sie sie in Funktionen) und speichert sie in einer globalen Variable, zB Site . Dann triggern Sie Ihre contollerspezifische js, indem Sie etwas wie

schreiben %Vor%

im body-Tag.

Auf diese Weise wird der eigentliche contollerspezifische js-Code nur einmal geladen und bei Bedarf getriggert.

Implementierung

app/assets/javascripts/site.js

%Vor%

Wickeln Sie Ihren Controller js in Funktionen und speichern Sie sie in Site . Zum Beispiel users.js

app/assets/javascripts/site.js

%Vor%

in Ihrer application.js laden Sie alle.

app/assets/javascripts/site.js

%Vor%

Dann triggern Sie in Ihrem Layout die Controller spezifische js.

app/views/layouts/application.html.erb

%Vor%

Wie wäre es mit aktionsspezifischem js-Code?

Ändere einfach die site.js und das Layout. Und ich beende es mit dem folgenden Ausschnitt.

%Vor%

app/views/layouts/application.html.erb

%Vor%

Verwandte

Hier ist ein interessantes Video über das Laden von JavaScript, CSS und anderen Assets für einzelne Seite Apps, die Sie gerne sehen möchten.

OSCON 2014: Wie Instagram.com funktioniert; Pete Hunt

Ссылка

    
wenjun.yan 20.12.2014 09:13
quelle