Является ли View или ViewModel ответственным за преобразование данных из модели, представляемой в пользовательском интерфейсе? - PullRequest
1 голос
/ 16 апреля 2019

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

У меня есть:

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

Насколько я понимаю, 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?

1 Ответ

2 голосов
/ 16 апреля 2019

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

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

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

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

Надежда, которая отвечает на ваш вопрос.

...