В MVC, что такое ViewModel?
Я правильно понимаю, что это почти как обертка для всех объектов, необходимых для представления?
Например, скажем, у вас был интернет-магазин, в котором продавались музыка и DVD. На странице просмотра вы хотите отобразить список всех ваших DVD-дисков и музыки. Итак, вы бы построили объект ViewModel, который имеет два свойства, содержащие список альбомов и список dvds?
Из моего понимания кажется, что у вас есть все ваши модельные классы, т.е. класс Album/Dvd, но просто передать их один будет недостаточно для вашего представления. Использует ли ViewModel в качестве носителя для всех данных, которые требуется вашему представлению?
Ответы
Ответ 1
Ваше понимание в основном правильное, но оно не завершено.
ViewModel также может выполнять преобразования из типа данных, которые несет ваша модель, к типу данных, с которыми может удобно работать View; это может даже означать, что ViewModel не переносит Модели напрямую, а другие сосуды, которые несут (возможно, подмножество) одну и ту же информацию в более подходящем формате.
Учтите, что у вас может быть модель библиотеки, которая объединяет альбомы и DVD-диски. Разница между такой моделью и соответствующей ViewModel заключается в том, что модели не волнует (или даже знает) представление, в то время как ViewModel имеет чтобы облегчить его.
Ответ 2
ViewModels позволяют вам формировать несколько объектов из одной или нескольких моделей данных или источников в один объект, оптимизированный для потребления и рендеринга с помощью представления.
Цель ViewModel заключается в том, чтобы представление имело один объект для визуализации, облегчающий необходимость в логическом коде UI в представлении, которое в противном случае было бы необходимо. Это означает, что единственная ответственность или забота о представлении заключается в том, чтобы сделать этот единственный объект ViewModel, помогая более чистому разделению проблем (SoC). Озабоченность представляет собой различные аспекты приложения, которые имеют определенную цель (т.е. Беспокойство), и сохранение этих аспектов в отдельности означает, что ваше приложение более организовано, а код более сфокусирован. Помещение кода манипулирования данными в своем собственном местоположении в сторону от представления и контроллера, обеспечивает соблюдение SoC.