Является ли View или ViewModel ответственным за преобразование данных из модели, представляемой в пользовательском интерфейсе?

1

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

Я имею:

  • Класс данных Place который содержит широту, долготу, имя и т.д.
  • MapsViewModel который содержит список мест LiveData<List<Place>> используемый MapsFragment
  • И MapsFragment, который представляет собой View узора MVVM.

MapsFragment я понимаю, View должно не учитывать Model, в этом случае MapsFragment не должен знать о модели Place.

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

Я не уверен, должен ли я разместить код для сопоставления мест с маркерами внутри MapsViewModel чтобы MapsFragment мог просто вызывать mapsViewModel.getMarkers() и использовать этот список маркеров для заполнения карты, или должен ли MapsFragment наблюдать mapsViewModel.getPlaces() и от карты ответа список до маркеров, а затем заполните карту.

Если предполагается, что MapsViewModel отвечает за сопоставление мест, как я буду наблюдать за изменениями в LiveData при добавлении новых мест?

Если предполагается, что MapsFragment отвечает за отображение, то не нарушает ли это шаблон MVVM, когда Views не должны знать о модели?

Пример написан на Kotlin но я не пометил вопрос с Kotlin потому что он не зависит от языка.

В моих текущих реализациях я наблюдаю за местами LiveData<List<Place>>

// MapsFragment
...
override fun onMapReady(googleMap: GoogleMap) {
    mMap = googleMap
    mapsViewModel.getPlaces().observe(this, Observer { places ->
        places?.forEach { place ->
            var options = MarkerOptions()
            options.position(LatLng(place.lat.toDouble(), place.lon.toDouble()))
            mMap.addMarker(options)
        }
    })
}
...
// MapsViewModel
...
fun getPlaces(): LiveData<List<Place>> {
    return Repositories.placesRepository.getPlaces()
}
...

PS Один боковой вопрос для ListViews и других типов коллекций: должна ли каждая ячейка иметь собственную ViewModel или весь ListView должен иметь только одну ViewModel?

Теги:
google-maps
design-patterns
mvvm
viewmodel

1 ответ

0

В архитектуре MVVM ViewModel предоставляет поток данных, относящихся к View. Таким образом, ваш View обязательно должен соблюдать список Place.

Если предполагается, что MapsFragment отвечает за отображение, то не нарушает ли это шаблон MVVM, когда представления не должны знать о модели?

У нас все хорошо, если View не взаимодействует напрямую/не изменяет слой данных (Model) и не получает всю отображаемую информацию только из ViewModel.

Общее правило:
Поток данных, предоставляемый ViewModel должен быть достаточно простым для непосредственного использования View.

Надеюсь это ответит на твой вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню