Drab - Accédez à l'interface utilisateur du navigateur du côté serveur. Aucune programmation JavaScript ne nécessaire!
Drab étend le framework Phoenix à l'interface utilisateur "télécommande" sur le navigateur, en direct. L'idée est de déplacer toute la logique de l'interface utilisateur vers le côté du serveur, pour éliminer les appels JavaScript et AJAX.
< div class =" progress " >
< div class =" progress-bar <%= @progress_bar_class %> " role =" progressbar " @style.width = < %= " #{@bar_width}% " % > >
< %= "#{@bar_width}%" % >
</ div >
</ div >
< button class =" btn btn-primary " drab-click =" perform_long_process " >
< %= @long_process_button_text % >
</ button > defhandler perform_long_process ( socket , _sender ) do
poke socket , progress_bar_class: "progress-bar-danger" , long_process_button_text: "Processing..."
steps = :rand . uniform ( 100 )
for i <- 1 .. steps do
Process . sleep ( :rand . uniform ( 500 ) ) #simulate real work
poke socket , bar_width: Float . round ( i * 100 / steps , 2 )
end
poke socket , progress_bar_class: "progress-bar-success" , long_process_button_text: "Click me to restart"
end Elixir ~> 1.6.0 (voir Guide d'installation)
Phoenix ~> 1.2 (voir Guide d'installation)
Cela a les mêmes exigences que Phoenix.Sockets. Ci-dessus, cela dépend du javascript que vous appelez ou d'autres outils potentiels que vous utilisez sur Drab.
Tout d'abord, vous devez avoir une application Phoenix, en plus de laquelle vous installerez DRAB. S'il s'agit d'une application standard, générée avec mix phx.new , vous pouvez utiliser Drab Installateur pour le faire fonctionner en une seule étape. Sinon, voir la section d'installation manuelle ci-dessous.
mix.exs dans le dossier principal de votre application Web (si vous avez plusieurs applications sous un parapluie, c'est celui qui se termine par _web ). Localisez la fonction deps (recherchez la chaîne def deps ). Ajoutez une entrée {:drab, "~> 0.10.0"} à la liste. N'oubliez pas la virgule! def deps do
[
{ ... } ,
{ :drab , "~> 0.10.0" }
]
end$ mix deps.getmix drab.install : bash% mix drab.install
Checking prerequisites for :my_app
lib/my_app_web/templates/layout/app.html.eex
lib/my_app_web/channels/user_socket.ex
config/config.exs
config/dev.exs
The installer is going to modify those files. OK to proceed? [Yn] Y
Drab has been successfully installed in your Phoenix application.
Now it is time to create your first commander, for example, for PageController:
mix drab.gen.commander Page
Félicitations! Vous avez installé DRAB et vous pouvez procéder avec votre propre commandant.
Veuillez noter que Drab fonctionnera uniquement sur des pages, qui ont le commandant correspondant.
Toutes les fonctions ternes (rappels, gestionnaires d'événements) sont placées dans le module appelé Commander . Pensez-y comme un contrôleur pour les pages en direct. Les commandants doivent être placés dans le répertoire web/commanders .
Pour activer Drab sur les pages générées avec le contrôleur correspondant, vous devez créer un commandant jumeau. Par exemple, pour MyApp.PageController le commandant doit être nommé MyApp.PageCommander .
N'oubliez pas la différence: controller rend la page, tandis que commander travaille sur la page en direct.
PageController devrait avoir PageCommander : $ mix drab.gen.commander Page
* creating web/commanders/page_commander.ex@welcome_text à render/3 dans l'action d'index dans le contrôleur, à utiliser à l'avenir: defmodule MyApp.PageController do
use Example.Web , :controller
def index ( conn , _params ) do
render conn , "index.html" , welcome_text: "Welcome to Phoenix!"
end
end Renommer le modèle de web/templates/page/index.html.eex à index.html.drab
Modifiez le modèle web/templates/page/index.html.drab et modifiez le texte de bienvenue fixe à l'Assign:
< div class =" jumbotron " >
< h2 > < %= @welcome_text % > </ h2 >web/commanders/page_commander.ex et ajoutez une réelle action - le rappel onload , qui tire lorsque le navigateur se connecte au serveur DRAB: defmodule DrabExample.PageCommander do
use Drab.Commander
onload :page_loaded
# Drab Callbacks
def page_loaded ( socket ) do
poke socket , welcome_text: "This page has been drabbed"
set_prop socket , "div.jumbotron p.lead" ,
innerHTML: "Please visit <a href='https://tg.pl/drab'>Drab</a> page for more"
end
end La fonction poke/2 met à jour l'Assign. Le set_prop/3 met à jour toute propriété de l'objet DOM. Tout est terminé en direct, sans recharger la page.
iex -S mix phoenix.server . Allez sur http://localhost:4000 pour voir la page Web modifiée. Vous pouvez maintenant jouer avec cette page en direct, directement depuis iex ! Observez les instructions données lorsque votre navigateur se connecte à la page: [ debug ]
Started Drab for same_path :/ , handling events in DrabExample.PageCommander
You may debug Drab functions in IEx by copy / paste the following:
import Drab . { Core , Element , Live }
socket = Drab . get_socket ( pid ( "0.653.0" ) )
Examples :
socket |> exec_js ( "alert('hello from IEx!')" )
socket |> poke ( count: 42 )Comme indiqué, copiez et collez ces deux lignes, et consultez vous-même comment vous pouvez contrôler à distance la page affichée:
iex > alert socket , "Alert title" , "Do you like modals?" , buttons: [ ok: "A juści" , cancel: "Poniechaj" ]
{ :ok , % { } }
iex > poke socket , welcome_text: "WOW, this is nice"
% Phoenix.Socket { ... }
iex > query socket , "div.jumbotron h2" , :innerText
{ :ok ,
% { "[drab-id='425d4f73-9c14-4189-992b-41539377c9eb']" => % { "innerText" => "WOW, this is nice" } } }
iex > set_style socket , "div.jumbotron" , backgroundColor: "red"
{ :ok , 1 }Visitez la page de démonstration pour une démo en direct et plus de description.
Visitez la page de documentation.
Il y a un fil de terne sur elixirforum.com, veuillez y répondre.
Depuis 0.3.2, Drab est équipé de son propre serveur Phoenix pour exécuter automatiquement des tests d'intégration, pour le sable et pour jouer avec.
git clone [email protected]:grych/drab.git
cd drabmix deps.get
npm install && node_modules/brunch/bin/brunch buildiex -S mix phoenix.serverOuvrez le navigateur et accédez à http: // localhost: 4000
Suivez les instructions dans IEX pour jouer avec les fonctions ternes:
import Drab . { Core , Live , Element , Query , Waiter }
socket = Drab . get_socket ( pid ( "0.784.0" ) )
iex > query socket , "h3" , :innerText
{ :ok ,
% { "#header" => % { "innerText" => "Drab Tests" } ,
"#page_loaded_indicator" => % { "innerText" => "Page Loaded" } } }
iex > set_prop socket , "h3" , innerText: "Updated from IEx"
{ :ok , 2 }
iex > exec_js socket , "alert('You do like alerts?')"
{ :ok , nil }La plupart des tests ternes sont des tests d'intégration (de bout en bout), ils nécessitent donc un navigateur automatisé. Drab utilise Chromedriver, qui doit être en cours d'exécution pendant que vous exécutez des tests.
git clone [email protected]:grych/drab.git
cd drabmix deps.get
npm install && node_modules/brunch/bin/brunch build exécuter chromedriver
Exécutez des tests:
% mix test
Compiling 23 files (.ex)
........................................
Finished in 120.9 seconds
123 tests, 0 failures
Randomized with seed 934572 Ajoutez de la terne aux dépendances dans mix.exs .
Initialisez la bibliothèque client drab en ajoutant à la page de mise en page ( app.html.eex - ou toute autre mise en page que vous utilisez).
< %= Drab.Client.run(@conn) % >Juste après la ligne suivante:
< script src =" <%= static_path(@conn, "/js/app.js") % > "> </ script >user_socket.ex : use Drab.Socketconfig.exs : config :phoenix , :template_engines ,
drab: Drab.Live.Engine
config :drab , MyAppWeb.Endpoint ,
otp_app: :my_app_web:drab aux applications démarrées par défaut dans mix.exs : def application do
[ mod: { MyApp , [ ] } ,
applications: [ :phoenix , :phoenix_pubsub , :phoenix_html , :cowboy , :logger , :gettext , :drab ] ]
endCe n'est pas nécessaire si vous exécutez Phoenix 1.3
.drab pour recharger les modèles de rechargement dans dev.exs : config :my_app , MyApp.Endpoint ,
live_reload: [
patterns: [
~r { priv/static/.*(js|css|png|jpeg|jpg|gif|svg)$ } ,
~r { priv/gettext/.*(po)$ } ,
~r { web/views/.*(ex)$ } ,
~r { web/templates/.*(eex|drab)$ }
]
]require is not defined . Vous devez fournir Socket : Dans l' app.js ajoutez une variable globale, qui sera transmise à Drab plus tard:
window . __socket = require ( "phoenix" ) . Socket ; Ensuite, dites à Drab de l'utiliser au lieu de require("phoenix").Socket . Ajouter à config.exs :
config :drab , MyAppWeb.Endpoint ,
js_socket_constructor: "window.__socket" jquery et boostrap à package.json : "dependencies" : {
"jquery" : " >= 3.1.1 " ,
"bootstrap" : " ~3.3.7 "
}brunch-config.js : npm: { globals : {
$ : 'jquery' ,
jQuery : 'jquery' ,
bootstrap : 'bootstrap'
} }$ npm install && node_modules/brunch/bin/brunch build(c) 2016-2018 Tomek "Grych" Gryzkiewicz, [email protected]
Illustrations de https://www.vecEezy.com