Я пытаюсь использовать bootstrap -select - библиотеку javascript / css, расширяющую тег html -select приятными функциями и стилем. На первый взгляд, назвать его из вяза кажется простым. Действительно, урезанный
view : Model -> Html Msg
view model =
select [ class "selectpicker", attribute "data-live-search" "true" ]
[ option [] [ text "foo" ]
, option [] [ text "bar" ]
]
дает красивое (доступное для поиска) поле выбора с двумя элементами. Однако, все усложняется в динамических c ситуациях. Предположим, что наша модель вяза является логическим, решающим, показывать или нет окно выбора.
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" ]
При загрузке страницы мы снова видим красивое окно выбора, которое исчезает при нажатии кнопки переключения. Однако при повторном нажатии кнопки переключателя окно выбора снова не появится! Причина в том, что узлы selectpicker должны обновляться, если содержимое изменилось (включая включение / отключение узла). То есть мы должны позвонить
$('.selectpicker').selectpicker('refresh');
извне Javascript world после наше поле выбора было снова добавлено в DOM.
Я пытался решить эту проблему с помощью портов, но, к сожалению, я получил только elm для запуска события перед рендерингом, поэтому мне пришлось дополнительно использовать setTimeout
, чтобы дождаться завершения, что довольно странно. Я полагаю, что должно быть изящное решение с использованием пользовательского элемента, но, опять же, я не смог понять, как вызвать функцию refre sh в нужный момент.
Любая помощь очень ценится!