榆树的Bootstrap Dropdown

mdm*_*mdm 6 twitter-bootstrap elm twitter-bootstrap-3

我对榆树很新(并且总体来说是前端开发),所以我希望我的问题不是太明显,但我想知道如何重用UI框架,如Elm中的Bootstrap 3,包括JS.

更确切地说,我今天的目标是或多或少地复制Bootstrap的Navbar文档中的示例,其中下拉按钮包含在导航栏中.到目前为止,使用HtmlHtml.Attributes,我能够构建页面并正确设置样式,但实际的下拉行为不起作用:当我点击插入符号按钮时,没有任何反应.我猜这是因为连接到下拉列表的Javascript没有被执行.

现在,我的问题是:

  1. 如何从Elm代码中重用下拉列表等组件,包括相关的JS?
  2. 在榆树中这样做的首选(更惯用)方式是什么?我已经看过像circuithub的elm-bootstrap-dropdown这样软件包,我知道它是在同一个JS功能的Elm中完全重写的,所以我想知道:榆树是从头开始重写所有内容的方法吗?我会对此感到非常惊讶......

谢谢你们

And*_*son 11

我目前正在现实生活中使用Bootstrap进行现实生活中的Elm项目,它的工作效果非常好.

我认为你不想通过复制榆树中的东西整合到榆树中.根据我的经验,您将始终是当前Bootstrap版本背后的一(或两)个步骤.

尽管设置完成所有设置可能有点挑战,但一旦完成它运行完美无瑕.为了让你前进,我发布了index.html我用来加载Elm应用程序的文件.它是一个带有客户端路由的单页应用程序,这就是我将其发送window.location.pathname到应用程序的原因.它与使用Bootstrap无关.我包括它因为我真的想或多或少地"按原样"发布文件.

基本上我们只是在加载和启动Elm应用程序之前,直接从内容分发网络将Bootstrap CSS和JS加载到浏览器中.

index.html:

<!DOCTYPE HTML>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->

  <title>My Awesome Application Title</title>

  <!-- Bootstrap: Latest compiled and minified CSS -->
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous">

  <!-- Bootstrap: Optional theme -->
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap-theme.min.css" integrity="sha384-fLW2N01lMqjakBkx3l/M9EahuwpSfeNvV63J5ezn3uZzapT0u7EYsXMjQV+0En5r" crossorigin="anonymous">

  <!-- Application styles -->
  <!-- link rel="stylesheet" href="normalize.css" -->
  <!-- link rel="stylesheet" href="skeleton.css" -->
  <link rel="stylesheet" href="app.css">

  <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
  <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
  <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
  <![endif]-->
</head>
<body>
  <!-- Bootstrap: jQuery (necessary for Bootstrap's JavaScript plugins) -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

  <!-- Bootstrap: Latest compiled and minified JavaScript -->
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script>

  <!-- Application: Javascript -->
  <!-- script type="text/javascript" src="vendor.js"></script -->
  <script type="text/javascript" src="native.js"></script>
  <script type="text/javascript" src="app.js"></script>

  <!-- Fire up the Elm application -->
  <script type="text/javascript">
    // Pass along the current pathname as "path" to the Elm application.
    //
    // This way the frontend router can decide what "page" to display.
    //
    var app = Elm.fullscreen(Elm.App, {path: window.location.pathname});

    // Alternatively, embed the elm app in an element like this:
    // var div = document.getElementById('myDiv');
    // Elm.embed(Elm.Index, div);
  </script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

一旦我们启动了Elm应用程序,就像使用Bootstrap的任何其他项目一样,生成Bootstrapified HTML和CSS的简单方式.

为了让您了解如何实现导航栏,这是我在Elm中导航条形码的简单摘录:

-- Navigation bar ------------------------------------------------------------
--
-- TODO: Adapt to more responsive design. Stack navigation in mobile-friendly
--       layout and minimize user/instrument information.
--

-- Page link buttons

pageLinks : Context -> List Html
pageLinks (link, model, _) =
  List.map (\p ->
    li  [ classList [ ("active", model.page == p) ] ]
        [ link (pageToRoute p) (pageName p) ]) visiblePages

-- Dropdown menu with available options

dropdownSelectOption : Context -> Html
dropdownSelectOption (_, model, address) =
  let
    -- Option selection row (displayed in dropdown menu)
    iRow i =
      let
        title_ = case i.macId of
          Just macId -> macId   -- primarily use macId if available
          Nothing    -> i.uuid  -- otherwise, fallback on using the uuid
        -- Determine if the option is selected and/or online/offline
        isSelected = isActiveOption model i.uuid
      in
        li  [ title title_ ]
            [ a [ href "#", onClick address (SelectOption i.uuid) ]
                [ text i.displayName,
                  span [ classList [("pull-right glyphicon glyphicon-remove-sign status-offline", i.status == Offline),
                                    ("pull-right glyphicon glyphicon-ok-sign status-online", i.status == Online),
                                    ("pull-right glyphicon glyphicon-question-sign status-unknown", i.status == Unknown)],
                         title (optionStatusToString i.status)
                       ] [],
                  span [ classList [("pull-right glyphicon glyphicon-eye-open selected", isSelected)],
                         title (OptionSelectedTooltip |> t)
                       ] []
                ]
            ]
    -- Map rows on list of options
    iSelectList = List.map iRow model.options
  in
    li  [ class "dropdown", title (OptionSelectTooltip |> t) ]
        [ a [ class "dropdown-toggle",
              href "#",
              attribute "data-toggle" "dropdown",
              attribute "role" "button",
              attribute "aria-haspopup" "true",
              attribute "aria-expanded" "false" ]
            [ OptionSelectionMenu |> tt,
              span [ class "caret" ] []
            ],
          ul  [ class "dropdown-menu dropdown-menu-right" ]
              (List.concat [
                [ li [ class "dropdown-menu-label" ]
                     [ span [] [ OptionSelectLabel |> tt ] ],
                  li [ class "divider", attribute "role" "separator" ] [] ],
                iSelectList])
        ]

-- The complete navigation bar

navigationBar : Context -> Html
navigationBar ctx =
  ul  [ class "nav nav-pills pull-right" ]
     ([ (pageLinks ctx),
      [ (dropdownSelectOption ctx) ]
      ] |> List.concat)
Run Code Online (Sandbox Code Playgroud)

很显然,你可以看到我在这个例子中没有包含很多功能(出于IP原因),但它可以让你知道如何去做.(例如,tt函数转换为一个字符串,然后由text它转换.它是一个支持不同语言的翻译模块).

如果你只是将Bootstrap内部保留在Elm之外的JS/CSS空间中,那么这一切都非常简单.根据我的经验,它没有弄乱Elm diffing算法,因为建议可能是一个问题.

祝好运!榆树真的是一个伟大的语言和范例,用于编写前端代码,一旦你绕过它.