gpt4 book ai didi

javascript - 使用 elm 中的 bootstrap-select

转载 作者:行者123 更新时间:2023-12-02 20:52:32 25 4
gpt4 key购买 nike

我正在尝试使用 bootstrap-select - 一个 javascript/css 库,扩展了 html-select-tag,具有良好的功能和风格。乍一看,从 elm 调用它似乎很简单。确实,被剪掉了

view : Model -> Html Msg
view model =
select [ class "selectpicker", attribute "data-live-search" "true" ]
[ option [] [ text "foo" ]
, option [] [ text "bar" ]
]

产生一个漂亮的(可搜索的)选择框,其中包含两个项目。然而,在动态情况下事情会变得复杂。假设我们的 elm 模型是一个 bool 值,决定是否显示选择框。

type alias Model = Bool

init : Model
init = True

update : Msg -> Model -> Model
update Toggle model = not model

view : Model -> Html Msg
view model =
if model then
div []
[ select [ class "selectpicker", attribute "data-live-search" "true" ]
[ option [] [ text "foo" ]
, option [] [ text "bar" ]
]
, button [ onClick Toggle ] [ text "toggle" ]
]
else
button [ onClick Toggle ] [ text "toggle" ]

加载页面时,我们再次看到一个漂亮的选择框,当点击切换按钮时该选择框就会消失。然而,当再次点击toogle按钮时,选择框将不会再次出现!原因是如果内容发生更改(包括启用/禁用节点),则需要刷新 selectpicker 节点。也就是说,我们必须调用

$('.selectpicker').selectpicker('refresh');

从外部 Javascript 世界之后我们的选择框再次添加到 DOM 中。

我尝试使用端口来解决这个问题,但不幸的是,我只让 elm 在渲染之前触发一个事件,因此我还必须使用 setTimeout 来等待完成,这是相当hacky的。我想一定有一个使用自定义元素的简洁解决方案,但同样,我无法弄清楚如何在正确的时刻调用刷新函数。

非常感谢任何帮助!

最佳答案

最后,我设法将 bootstrap-select 包装到一个(最小的、不完美的)自定义元素中,该元素会在更新时自动刷新。这是:

import { LitElement, html, customElement, property } from 'lit-element';
import * as $ from 'jquery';
import 'bootstrap';
import 'bootstrap-select';

@customElement('lit-select')
export class LitSelect extends LitElement {

@property({ type : Array }) items = []

updated() {
$(this).find(".selectpicker").selectpicker('refresh');
}

createRenderRoot() {
return this;
}

private renderItem(item: string) {
return html`
<option>
${item}
</option>
`;
}

render() {
return html`
<select class="selectpicker" data-live-search = "true">
${this.items.map(item => this.renderItem(item))}
</select>
`;
}
}

此元素可以从 HTML 创建为

<lit-select items='["foo", "bar"]'></lit-select>

或来自 elm 作为

node "lit-select" [ attribute "items" "[\"foo\",\"bar\"]" ] []

它也适用于上述动态情况。然而,一个明显的缺点是项目列表必须提供给编码为 json 字符串的 lit-select 属性。因此标记的可能性相当有限(例如,用户无法决定是给 lit-select 一堆选项还是一堆选项组)。

我很高兴看到更好的解决方案,但由于这是另一个主题,我很快就会提出一个后续问题。

关于javascript - 使用 elm 中的 bootstrap-select,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61572939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com