2017-02-22 35 views
2

Как я могу визуализировать конкретный компонент purescript-галогена в головке < >?Как визуализировать компоненты purescript-галогена в теге <head>

Следующий пример написан для галогенных 1.0.0 делает таблицы стилей и абзаца в HTML теле:

module Main where 

import Prelude 
import Control.Monad.Eff  (Eff) 
import Data.Maybe    (Maybe(Nothing)) 

import CSS     as C 
import Halogen    as H 
import Halogen.Aff   as HA 
import Halogen.HTML   as HH 
import Halogen.HTML.CSS  as HS 
import Halogen.Query.HalogenM as HQ 
import Halogen.VDom.Driver as HV 

styles :: forall p i. HH.HTML p i 
styles = HS.stylesheet $ 
    C.select C.body $ C.margin C.nil C.nil C.nil C.nil 

content :: forall p i. HH.HTML p i 
content = HH.p_ [ HH.text "Test" ] 

main :: Eff (HA.HalogenEffects()) Unit 
main = HA.runHalogenAff $ HA.awaitBody >>= HV.runUI ui unit 
    where 
    ui = H.component { initialState : const unit 
        , render  : const render 
        , eval   : const $ HQ.halt "no query" 
        , receiver  : const Nothing 
        } 

    render = HH.div_ [ styles, content ] 

DOM-генерируется следующим образом:

<html> 
    <head> 
     <title>Test</title> 
     <script async="" type="text/javascript" src="main.js"></script> 
    </head> 
    <body> 
     <div> 
      <style type="text/css"> 
       body { margin: 0 0 0 0 } 
      </style> 
      <p> 
       Test 
      </p> 
     </div> 
    </body> 
</html> 

Этот пример работает, но по для элемента specification элемент стиля разрешен только «где ожидается контент метаданных», то есть < глава > элемент. Поэтому я хочу отобразить таблицу стилей. Как это сделать?

+0

Зачем ставить таблицу стилей с помощью галогена, если она полностью статична? Можно создавать атрибуты стиля для определенных элементов, если требуется такая гибкость. Но вопрос в целом по-прежнему интересен ... Я думаю о . – <span class="text-secondary"> <small> <a rel="noopener" target="_blank" href="https://stackoverflow.com/users/1862339/">stholzm</a></span> <span></span> </small> </span> </p> </div> </div> </div> <div itemprop="comment" class="post-comment"> <div class="row"> <div class="col-lg-1"><span class="text-secondary">+1</span></div> <div class="col-lg-11"> <p class="commenttext">Рендеринг статической таблицы стилей в Purescript имеет следующие преимущества: вы можете использовать всю мощь PureScript для сборки таблицы стилей и не нуждаться в другом препроцессоре CSS, таком как Sass или Less. Кроме того, вы можете модулизовать код, чтобы компоненты Halogen сохранялись вместе со своими стилями. Использование атрибутов стиля не является вариантом, если вам нужны медиа-запросы или псевдоклассы типа ': hover'. – <span class="text-secondary"> <small> <span></span> </small> </span> </p> </div> </div> </div> </div> </div> </article> </div> <div class="answer-title"> <span class="text-logo margin-top-sm">A</span> <h2 class="title h4">ответ</h2> </div> <div class="item-description text-md markdown-body margin-bottom-40 voidso"> <article class="board-top-1 padding-top-10"> <div class="post-col vote-info"> <span class="count">2<i class="fa fa-thumbs-up"></i></span> <i class="fa fa-check fa-2x"></i> </div> <div class="post-offset"> <div class="answer fmt"> <p>Обратите внимание, что функция <code class="prettyprint-override">awaitBody</code> - так же, как и ожидающая ее загрузки, выбирает элемент <code class="prettyprint-override">body</code>, который в действительности не является тем, что вы хотите. Если вы хотите записать в <code class="prettyprint-override">head</code>, вам нужно будет выбрать его и передать его <code class="prettyprint-override">runUI</code> для компонента, который отображает таблицу стилей.</p> <p>Вам также необходимо запустить два отдельных компонента, один для <code class="prettyprint-override">head</code>, один за <code class="prettyprint-override">body</code>:</p> <pre><code class="prettyprint-override">module Main where import Prelude import Control.Monad.Aff.Console (CONSOLE) import Control.Monad.Eff (Eff) import Data.Const (Const) import Data.Foldable (traverse_) import Data.Maybe (Maybe(..)) import Data.Newtype (unwrap) import Halogen as H import Halogen.Aff as HA import Halogen.HTML as HH import Halogen.VDom.Driver (runUI) bodyComponent :: forall m. H.Component HH.HTML (Const Void) Unit Void m bodyComponent = H.component { initialState: const unit , render: const $ HH.div_ [ HH.text "A component" ] , eval: absurd <<< unwrap , receiver: const Nothing } styleComponent :: forall m. H.Component HH.HTML (Const Void) Unit Void m styleComponent = H.component { initialState: const unit , render: const $ HH.style_ [ HH.text "body { background: #222; color: #eee }"] , eval: absurd <<< unwrap , receiver: const Nothing } main :: Eff (HA.HalogenEffects (console :: CONSOLE)) Unit main = HA.runHalogenAff do HA.awaitLoad traverse_ (runUI styleComponent unit) =<< HA.selectElement "head" traverse_ (runUI bodyComponent unit) =<< HA.selectElement "body" </code></pre> <p>Если они нуждаются в общении, то вы могли бы использовать <code class="prettyprint-override">subscribe</code> и <code class="prettyprint-override">driver</code> функции из <code class="prettyprint-override">HalogenIO</code> записи что <code class="prettyprint-override">runUI</code> позволяет настроить каналы между ними.</p> <p>У меня возникли проблемы с этим, поскольку вы должны пройти через элемент, который пуст, как цель для того, где будет отображаться контейнер ... но при использовании драйвера <code class="prettyprint-override">VDom</code> с галогеновым генератором он, по-видимому, ведет себя что содержание <code class="prettyprint-override"><head></code> не будет заменено компонентом стиля (оно добавляется до конца). Это, в основном, неуказанное поведение, поэтому я не уверен, что это обязательно будет верно для других драйверов.</p> </div> <div class="post-info"> <div class="post-meta row"> <p class="text-secondary col-lg-6"> <span class="source"> <a rel="noopener" target="_blank" href="https://stackoverflow.com/q/42414762">источник</a> </span> </p> <p class="text-secondary col-lg-6"> <span class="float-right date"> <span>2017-02-23 11:39:51</span> </p> <p class="col-12"></p> <p class="col-12"></p></div> </div> <!-- comments --> <div class="comments"> <div itemprop="comment" class="post-comment"> <div class="row"> <div class="col-lg-1"><span class="text-secondary">+0</span></div> <div class="col-lg-11"> <p class="commenttext">Я пробовал ваше предложение, но я не мог запустить два компонента с 'runUI'. Выдается только первый. Затем я попытался запустить два экземпляра Halogen с 'runHalogenAff', и это сработало. Я не могу использовать два компонента/экземпляра для связи друг с другом, так что это нормально для меня. Экземпляры добавляют свой элемент в 'head' соответственно элемент' body' и не заменяют его содержимое, поэтому нет проблем с переписыванием, как вы догадались. – <span class="text-secondary"> <small> <span></span> </small> </span> </p> </div> </div> </div> <div itemprop="comment" class="post-comment"> <div class="row"> <div class="col-lg-1"><span class="text-secondary">+0</span></div> <div class="col-lg-11"> <p class="commenttext">Я отредактировал свой ответ, чтобы включить очень тривиальный рабочий пример. Я не уверен, какие проблемы вы могли бы иметь, но использование 'runUI' дважды, похоже, отлично работает для меня! – <span class="text-secondary"> <small> <span></span> </small> </span> </p> </div> </div> </div> <div itemprop="comment" class="post-comment"> <div class="row"> <div class="col-lg-1"><span class="text-secondary">+0</span></div> <div class="col-lg-11"> <p class="commenttext">Ошибка в моем коде заключалась в том, что 'awaitLoad' фактически вызывался дважды. Ваш пример отлично работает. Благодаря! – <span class="text-secondary"> <small> <span></span> </small> </span> </p> </div> </div> </div> </div> </div> </article> <div> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="1038284119" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> </div> <div class="clearfix"> </div> <div> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-format="autorelaxed" data-ad-client="ca-pub-6208739752673518" data-ad-slot="1575177025"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="padding-top-10"></div> </div> </div> <script type="text/javascript" src="http://img.uwenku.com/uwenku/script/side.js?t=1644592048337"></script> <script type="text/javascript" src="http://img.uwenku.com/uwenku/plugin/highlight/highlight.pack.js"></script> <link href="http://img.uwenku.com/uwenku/plugin/highlight/styles/docco.css" media="screen" rel="stylesheet" type="text/css" /> <script type="text/javascript"> $('pre').each(function(i, e) { hljs.highlightBlock(e, "<span class='indent'> </span>", false) }); </script> <div class="col-lg-3 col-md-4 col-sm-5"> <div id="rightTop"> <div class="row"> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-6208739752673518" data-ad-slot="5415218910" data-ad-format="auto" data-full-width-responsive="true"></ins> <script> (adsbygoogle = window.adsbygoogle || []).push({}); </script> </div> <div class="row sidebar panel panel-default"> <div class="panel-heading font-bold"> Последний вопрос </div> <div class="m-b-sm m-t-sm clearfix"> <ul class="side_article_list"> <li class="side_article_list_item"> 1. <a href="http://ru.uwenku.com/question/p-dgcmtccl-po.html" target="_blank" title="почему этот downcast терпит неудачу в C#?"> почему этот downcast терпит неудачу в C#? </a> </li> <li class="side_article_list_item"> 2. <a href="http://ru.uwenku.com/question/p-symkmmcs-qq.html" target="_blank" title="Когда случай в sql не поддерживается в cassandra cql"> Когда случай в sql не поддерживается в cassandra cql </a> </li> <li class="side_article_list_item"> 3. <a href="http://ru.uwenku.com/question/p-prebltll-oa.html" target="_blank" title="База данных EntityFramework Core.EnsureCreated не создает базу данных"> База данных EntityFramework Core.EnsureCreated не создает базу данных </a> </li> <li class="side_article_list_item"> 4. <a href="http://ru.uwenku.com/question/p-qvpoiptv-me.html" target="_blank" title="Адаптивное приложение Windows Presentation Foundation"> Адаптивное приложение Windows Presentation Foundation </a> </li> <li class="side_article_list_item"> 5. <a href="http://ru.uwenku.com/question/p-ahdmkftu-ha.html" target="_blank" title="Как создать каталог изображений и подкаталог с помощью webpack."> Как создать каталог изображений и подкаталог с помощью webpack. </a> </li> <li class="side_article_list_item"> 6. <a href="http://ru.uwenku.com/question/p-xikfauuy-z.html" target="_blank" title="Скрыть площадь панели док-станции"> Скрыть площадь панели док-станции </a> </li> <li class="side_article_list_item"> 7. <a href="http://ru.uwenku.com/question/p-bojyxcrl-cb.html" target="_blank" title="Document.ChangeListener удалены в Couchbase Lite"> Document.ChangeListener удалены в Couchbase Lite </a> </li> </ul> </div> </div> </div> <p class="article-nav-bar"></p> <div class="row sidebar article-nav"> <div class="row box_white visible-sm visible-md visible-lg margin-zero"> <div class="top"> <h3 class="title"><i class="glyphicon glyphicon-th-list"></i> Смежные вопросы</h3> </div> <div class="article-relative-content"> <ul class="side_article_list"> <li class="side_article_list_item">Нет связанных вопросов^_^</li> </ul> </div> </div> </div> </div> </div> </div> </div><!-- wrap end--> <!-- footer --> <footer id="footer"> <div class="bg-simple lt"> <div class="container"> <div class="row padder-v m-t"> <div class="col-xs-8"> <ul class="list-inline"> <li><a href="http://ru.uwenku.com/contact">Свяжитесь с нами</a></li> <li>© 2020 RU.UWENKU.COM</li> <li><a target="_blank" href="https://beian.miit.gov.cn/">沪ICP备13005482号-4</a></li> <li><script type="text/javascript" src="https://v1.cnzz.com/z_stat.php?id=1280101193&web_id=1280101193"></script></li> <li><a href="http://www.uwenku.com/" target="_blank" title="优文库">简体中文</a></li> <li><a href="http://hk.uwenku.com/" target="_blank" title="優文庫">繁體中文</a></li> <li><a href="http://ru.uwenku.com/" target="_blank" title="поле вопросов и ответов">Русский</a></li> <li><a href="http://de.uwenku.com/" target="_blank" title="Frage - und - antwort - Park">Deutsch</a></li> <li><a href="http://es.uwenku.com/" target="_blank" title="Preguntas y respuestas">Español</a></li> <li><a href="http://hi.uwenku.com/" target="_blank" title="कार्यक्रम प्रश्न और उत्तर पार्क">हिन्दी</a></li> <li><a href="http://it.uwenku.com/" target="_blank" title="IL Programma di chiedere Park">Italiano</a></li> <li><a href="http://ja.uwenku.com/" target="_blank" title="プログラム問答園区">日本語</a></li> <li><a href="http://ko.uwenku.com/" target="_blank" title="프로그램 문답 단지">한국어</a></li> <li><a href="http://pl.uwenku.com/" target="_blank" title="program o park">Polski</a></li> <li><a href="http://tr.uwenku.com/" target="_blank" title="Program soru ve cevap parkı">Türkçe</a></li> <li><a href="http://vi.uwenku.com/" target="_blank" title="Đáp ứng viên">Tiếng Việt</a></li> <li><a href="http://fr.uwenku.com/" target="_blank" title="Programme interrogation Park">Française</a></li> </ul> </div> </div> </div> </div> </div> </footer> <!-- / footer --> <script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?f78a970f17b19a79fc477a3378096f29"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script> </body> </html>