<!DOCTYPE html>
<html>
<head>
<title>MVVM with Native JS</title>
</head>
<body>
<input id="inputField" type="text">
<p id="outputText"></p>
<script>
class Observer {
constructor() {
this.subscribers = [];
}
subscribe(callback) {
this.subscribers.push(callback);
}
notify(data) {
this.subscribers.forEach(subscriber => {
subscriber(data);
});
}
}
class ViewModel {
constructor() {
this.data = {
inputValue: ''
};
this.inputObserver = new Observer();
}
setInputValue(value) {
this.data.inputValue = value;
this.inputObserver.notify(value);
}
bindInput(observerCallback) {
this.inputObserver.subscribe(observerCallback);
}
}
class Binder {
constructor(viewModel) {
this.viewModel = viewModel;
this.inputField = document.getElementById('inputField');
this.outputText = document.getElementById('outputText');
this.bindInput();
this.bindOutput();
}
bindInput() {
this.inputField.addEventListener('input', (event) => {
const newValue = event.target.value;
this.viewModel.setInputValue(newValue);
});
}
bindOutput() {
this.viewModel.bindInput((data) => {
this.outputText.textContent = data;
});
}
}
const viewModel = new ViewModel();
const binder = new Binder(viewModel);
</script>
</body>
</html>