В MVC, что такое ViewModel?

Я правильно понимаю, что это почти как обертка для всех объектов, необходимых для представления?

Например, скажем, у вас был интернет-магазин, в котором продавались музыка и DVD. На странице просмотра вы хотите отобразить список всех ваших DVD-дисков и музыки. Итак, вы бы построили объект ViewModel, который имеет два свойства, содержащие список альбомов и список dvds?

Из моего понимания кажется, что у вас есть все ваши модельные классы, т.е. класс Album/Dvd, но просто передать их один будет недостаточно для вашего представления. Использует ли ViewModel в качестве носителя для всех данных, которые требуется вашему представлению?

Ответ 1

Ваше понимание в основном правильное, но оно не завершено.

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

Учтите, что у вас может быть модель библиотеки, которая объединяет альбомы и DVD-диски. Разница между такой моделью и соответствующей ViewModel заключается в том, что модели не волнует (или даже знает) представление, в то время как ViewModel имеет чтобы облегчить его.

Ответ 2

ViewModels позволяют вам формировать несколько объектов из одной или нескольких моделей данных или источников в один объект, оптимизированный для потребления и рендеринга с помощью представления.

Цель ViewModel заключается в том, чтобы представление имело один объект для визуализации, облегчающий необходимость в логическом коде UI в представлении, которое в противном случае было бы необходимо. Это означает, что единственная ответственность или забота о представлении заключается в том, чтобы сделать этот единственный объект ViewModel, помогая более чистому разделению проблем (SoC). Озабоченность представляет собой различные аспекты приложения, которые имеют определенную цель (т.е. Беспокойство), и сохранение этих аспектов в отдельности означает, что ваше приложение более организовано, а код более сфокусирован. Помещение кода манипулирования данными в своем собственном местоположении в сторону от представления и контроллера, обеспечивает соблюдение SoC.