2015-08-12 4 views
1

Я новичок в Elm, вероятно, неправильное понимание архитектуры и это может быть XY вопрос (но я не знаю еще ...)SPA Динамическая маршрутизация и Page Rendering

В любом случае, я пытаясь создать URL-адрес в Elm. Я использую evancz/start-app для создания индивидуальных динамических страниц с использованием elm-achitecture-tutorial example 1 в качестве отправной точки для каждой «страницы»:

Frontend.Pages.Home.display : Signal Html 
Frontend.Pages.Home.display = StartApp.start 
    { model = 0 
    , update = update 
    , view = view 
    } 

type alias Model = Int 

type Action = Increment | Decrement 

update : Action -> Model -> Model 
update action model = 
    case action of 
    Increment -> model + 1 
    Decrement -> model - 1 

view : Signal.Address Action -> Model -> Html 
view address model = 
    div [] 
    [ button [ onClick address Decrement ] [ text "-" ] 
    , div [ countStyle ] [ text (toString model) ] 
    , button [ onClick address Increment ] [ text "+" ] 
    ] 

Я использую TheSeamau5/elm-router для

route : String -> Signal Html 
route = Router.match 
    [ "/" :-> Frontend.Pages.Home.display 
    ] Frontend.Pages.Errors.FourOhFour.display 

Я использую TheSeamau5/elm-history собрать последнюю URL :

main : Signal Html.Html 
main = Frontend.Routes.route History.path 

Очевидно, что это ошибка; Я передаю Signal String в метод, который принимает String. Проблема заключается в том, что если я использую следующее:

main = Signal.map Frontend.Routes.route History.path 

, который я ожидал бы Signal.map Frontend.Routes.route History.path быть типа Signal Html, а компилятор жалуется на конфликт:

The type annotation for `main` does not match its definition. 

7| main : Signal Html.Html 
      ^^^^^^^^^^^^^^^^ As I infer the type of values flowing through your program, I see a conflict between these two types: 

Html.Html 

Signal Html.Html 
  • Что здесь происходит? Похоже, что Signal.Map «распаковывает» Signal Html. Это так?

кажется мой основной вопрос, во всяком случае, это: Как я могу представить одностраничный-приложение, направляется на отдельные реактивные «страницы» на основе Signal String пока не реализовав Router?

Заранее спасибо.

ответ

1

Я считаю, что вы закончили с окончательным результатом Signal (Signal Html), а главное - Signal Html. Я считаю, что полученная вами ошибка относится именно к типу, который он ожидает для Signal a. Говорят, я ожидал, что a будет Html, но на самом деле я нашел его Signal Html.

Вот типы мы имеем:

Signal.map : (a -> result) -> Signal a -> Signal result 
Frontend.Routes.route : String -> Signal Html 
Historypath : Signal String 

Тогда мы имеем Signal.map Frontend.Routes.route, который имеет тип Signal String -> Signal (Signal Html).

Затем мы применяем History.path дает нам окончательный результат Signal (Signal Html)

Если изменить route вернуть Html, а не Signal Html вы должны быть хорошо идти.

+0

Извините, я не могу попробовать то, что вы сейчас говорите, но так я понимаю, я бы изменил подпись маршрута на 'route: String -> Html'? Не будет ли это просто перенаправить ошибку типа на функцию маршрута? «Frontend.Pages.Home.display: Signal Html» не может измениться, так как я пытаюсь расширить учебник по инфраструктуре (это выглядит так: http://elm-lang.org/examples/buttons), кроме make это СПА. Разве это не связано с удалением части StartApp MVU? Разве это не разрушает интерактивность на уровне модели, за исключением изменения URL-адреса? –

+0

Вы правы. Функция 'display' должна возвращать только' Html'. Если я правильно понимаю, 'display' реализуется с помощью' StartApp.start', который создает 'Signal.Html', который вы возвращаете. Это верно? – Joe

+0

Это правильно. –

Смежные вопросы