Пожалуйста, рассматривайте этот вопрос как строго воспитательный. Мне все еще интересно услышать новые ответы и идеи для реализации этого
TL;DR
Как мне реализовать двунаправленную привязку данных с JavaScript?
Связывание данных с DOM
Посредством привязки данных к DOM я имею в виду, например, наличие объекта JavaScript a
со свойством b
. Затем, имея элемент <input>
DOM (например), когда элемент DOM изменяется, a
изменяется и наоборот (то есть я имею в виду двунаправленную привязку данных).
Вот диаграмма AngularJS о том, как это выглядит:
Итак, у меня есть JavaScript, похожий на:
var a = {b:3};
Затем элемент ввода (или другой формы), например:
<input type='text' value=''>
Я хотел бы, чтобы значение ввода было a.b
(например), и когда текст ввода изменяется, я бы хотел, чтобы a.b
тоже изменился. Когда a.b
изменяется в JavaScript, вход изменяется.
Вопрос
Каковы основные методы для этого в простом JavaScript?
В частности, я хотел бы получить хороший ответ:
- Как связанная работа для объектов?
- Как может случиться изменение формы?
- Возможно ли простым образом изменить HTML на уровне шаблона? Я бы не стал отслеживать привязку в самом документе HTML, но только в JavaScript (с событиями DOM и JavaScript, содержащими ссылки на используемые элементы DOM).
Что я пробовал?
Я большой поклонник Усы, поэтому я попытался использовать его для шаблонов. Тем не менее, я столкнулся с проблемами при попытке выполнить привязку данных, поскольку Усест обрабатывает HTML как строку, поэтому после получения моего результата я не имею ссылки на то, где объекты в моей модели viewmodel. Единственным обходным решением, которое я мог бы подумать, было изменение строки HTML (или созданного дерева DOM) с помощью атрибутов. Я не против использовать другой шаблонный движок.
В принципе, у меня появилось сильное чувство, что я усложняю проблему, и есть простое решение.
Примечание.. Пожалуйста, не предоставляйте ответы, в которых используются внешние библиотеки, особенно те, которые являются тысячами строк кода. Я использовал (и вроде!) AngularJS и KnockoutJS. Мне действительно не нужны ответы в форме "use framework x". Оптимально, я хотел бы, чтобы будущий читатель, который не знает, как использовать множество фреймворков, чтобы понять, как реализовать двунаправленную привязку данных. Я не ожидаю полного ответа, но тот, который получает эту идею.