Изменения состояния MVU
Как я понимаю, в моделях Elm-style-view-update-update изменения в состоянии приложения следуют после отправки сообщения, которое определяет обновленное состояние. Здесь состояние является неизменным, поэтому изменения приводят к совершенно новому набору состояния приложения.
Например, ниже (взято из проекта Fabulous ) сообщение Pressed
приводит к изменению состояния Model.Pressed
на true
.
Я полагаю, что сообщение будет отправлено в результате явного действия пользователя, такого как нажатие кнопки "Отправить" или "Сохранить".
/// The messages dispatched by the view
type Msg =
| Pressed
/// The model from which the view is generated
type Model =
{ Pressed: bool }
/// Returns the initial state
let init() = { Pressed = false }
/// The function to update the view
let update (msg: Msg) (model: Model) =
match msg with
| Pressed -> { model with Pressed = true }
/// The view function giving updated content for the page
let view (model: Model) dispatch =
if model.Pressed then
View.Label(text="I was pressed!")
else
View.Button(text="Press Me!", command=(fun () -> dispatch Pressed))
type App () as app =
inherit Application ()
let runner =
Program.mkSimple init update view
|> Program.withConsoleTrace
|> Program.runWithDynamicView app
Изменения состояния привязки данных
Допустим, у вас есть модель в WPF, возможно, которая реализует INotifyPropertyChanged
и использует привязку данных для привязки вашего состояния к пользовательскому интерфейсу. Таким образом, состояние здесь изменчиво и со временем изменится.
Когда пользователь вводит новые значения, модель обновляется в результате привязки данных и без их явного сохранения или отправки. Из-за этого все вычисленные значения в модели будут обновляться по мере ввода значений пользователем. Вот пример модели, которая обновляет значение Age
при вводе новой даты рождения.
public class PersonView: INotifyPropertyChanged
{
private DateTime _birthday;
public DateTime Birthday
{
get { return _birthday; }
set
{
_birthday = value;
PropertyChanged("Birthday");
Age = CalculateAgeFromBirthday();
}
}
private int _age;
public int Age
{
get { return _age; }
private set
{
_age = value;
PropertyChanged("Age");
}
}
void PropertyChanged(string property)
{
// Etc.
}
int CalculateAgeFromBirthday()
{
// Do you sums here;
}
}
Вопрос
Мой вопрос заключается в том, существует ли эквивалентный способ в архитектурах модели-представления-обновления в стиле вяза для создания пользовательского интерфейса, который обновляет эти "вычисляемые свойства", когда пользователь вводит значения аналогично тому, как представление с привязкой к данным с помощью изменяемая модель?