Модель гибкой презентации: нужно ли держать государство в поле зрения?
У меня есть два экземпляра вида, которые V1a и V1b. Поскольку они являются экземплярами одного и того же типа, они оба используют один и тот же экземпляр модели представления (PM1), поскольку он внедряется в каждый экземпляр как одиночный. Каждое представление показывает различное состояние (S1a для V1a и S1b для V1b), но переключение между этими двумя представлениями (например, когда они находятся в TabNavigator) даст странные результаты:
- Пользователь смотрит на V1a и видит состояние на S1a;
- Пользователь смотрит на V1b и видит состояние для S1b;
- Пользователь снова смотрит на V1a, но на этот раз видит состояние для S1b.
Это связано с тем, что S1b перезаписывает состояние в синглтоне PM1, поэтому при повторном открытии V1a представление отображает состояние из V1b. У меня есть три решения:
- Не вводите синглтоны! но это, кажется, самый распространенный способ сделать это;
- Когда пользователь переключает представление, он повторно вводит свои данные в PM1. Это может усложниться в иерархических представлениях, где верхний уровень имеет состояние и должен внедрить его до нижнего уровня. Больше привязанности должно быть взято с привязками;
- Удерживайте состояние в представлении и передавайте его в ПМ, когда представление хочет действовать.
Решение 3 кажется самым простым. Однако все, что я прочитал о модели представления, имеет тенденцию предполагать, что состояние содержится в модели представления. Может кто-нибудь сказать мне, где я иду не так? Насколько я могу судить, гораздо проще и безопаснее удерживать состояние в представлении, чем в модели представления.
1 ответ
Решение 1 хорошее - настройте ваши классы PM так, чтобы они не были одиночками. К сожалению, насколько я читал, платформа Tide не поддерживает это. Другие структуры DI будут, например, Parsley (который больше не поддерживается) поддерживает DynamicObject, который каждый раз вводит новый экземпляр. RobotLegs (который поддерживается) имеет mapClass
отображение инжектора, которое даст вам новый экземпляр для каждой инъекции.
Решение 2 звучит грязно.
Решение 3 звучит нормально, если среда Tide не даст вам динамические объекты.