Тип Несоответствие - 1-й аргумент песочнице не то, что я ожидаю - PullRequest
4 голосов
/ 31 мая 2019

Я пытаюсь добавить подписки, так как у меня есть раскрывающийся список, это помогает автоматически закрывать раскрывающиеся списки, когда вы нажимаете вне их. При этом мне пришлось поменять model так же, как и мой update.

Эта ссылка (приведет вас на сайт Boosttrap вяза) - это раскрывающийся список, с которым я работаю и использует Bootstrap 4.

Ошибка, которую я получаю

1-й аргумент sandbox не тот, который я ожидаю:

295 | Browser.sandbox 296 |> {init = initialModel 297 |>
, update = update 298 |>, view = view 299 |>}

Этот аргумент является записью типа:

{ init : ( Model, Cmd Msg )
, update : Msg -> Model -> ( Model, Cmd Msg )
, view : Model -> Html Msg
}

Но sandbox нужен 1-й аргумент:

{ init : ( Model, Cmd Msg )
, update : Msg -> ( Model, Cmd Msg ) -> ( Model, Cmd Msg )
, view : ( Model, Cmd Msg ) -> Html Msg
}

Псевдоним Модель

type alias Model =
    { currentNumber : Int, clicks : Int, outputList : List(String), uniqueValues : Dict Int Int, firstNumber : String, secondNumber : String, myDropState : Dropdown.State, items : List String, selectedItem : String, dictKeyToRemove : String,
    modalVisibility : Modal.Visibility  }

Исходная модель

initialModel : (Model, Cmd Msg)
initialModel =
    ({ currentNumber = 0, clicks = 0, outputList = [""], uniqueValues = Dict.empty, firstNumber = "", secondNumber = "", myDropState = Dropdown.initialState, items = ["Small", "Medium", "Large"], selectedItem = "Small", dictKeyToRemove = "",
    modalVisibility = Modal.hidden }, Cmd.none)

Главная

main : Program () Model Msg
main =
    Browser.sandbox
        { init = initialModel           
        , update = update      
        , view = view   
        }

Абонементы

subscriptions : Model -> Sub Msg
subscriptions model =
    Sub.batch
        [ Dropdown.subscriptions model.myDropState DropMsg ]

Обновление

update : Msg -> Model -> ( Model, Cmd Msg)
update msg model =
    case msg of   
        DropMsg state ->
            ({model | myDropState = state }, Cmd.none)

Я не уверен, что мне не хватает в данный момент, я попытался изменить аргумент без удачи.

1 Ответ

7 голосов
/ 31 мая 2019

Browser.sandbox создаст простую и очень ограниченную программу. Для раскрывающегося списка требуются дополнительные возможности, а именно подписки, что означает, что вам нужно использовать Browser.element или Browser.document.

Тип Browser.element:

element :
    { init : flags -> ( model, Cmd msg )
    , view : model -> Html msg
    , update : msg -> model -> ( model, Cmd msg )
    , subscriptions : model -> Sub msg
    }
    -> Program flags model msg

По сравнению с Browser.sandbox:

sandbox :
    { init : model
    , view : model -> Html msg
    , update : msg -> model -> model
    }
    -> Program () model msg

Здесь есть три различия:

  1. init принимает аргумент flags, который может быть любым и будет интерпретироваться средой выполнения в соответствии с его типом. Для вашей цели достаточно просто использовать () (что, по сути, sandbox делает), но для получения более подробной информации см. раздел флагов руководства .

  2. init и update возвращает ( model, Cmd msg ) вместо model. Это основная причина вашей ошибки, потому что у вас есть функции update и init, которые возвращают ( model, Cmd msg ), как ожидалось бы element, но попытайтесь скорректировать их до sandbox. Это делает компилятор несчастным, потому что он думает, что model должно быть ( Model, Cmd msg ) вместо Model.

  3. element ожидает дополнительную функцию subscriptions, которую вы определили, но в настоящее время ничего не делаете, так как песочница не принимает ее.

Сложив все это вместе, подставив следующую main функцию, вы должны работать:

main : Program () Model Msg
main =
    Browser.element
        { init = \() -> initialModel           
        , update = update      
        , view = view
        , subscriptions = subscriptions  
        }
...