Что такое привязка?

Я все чаще встречаю термин "привязка" и "привязка к живым", особенно в инфраструктурах JavaScript, таких как Ember.js, Can.js, Knockout.js и Backbone.js, и более традиционно в Cocoa и Objective-C, и интересно, что такое привязка? (и что конкретно представляет собой "живая привязка"?).

Похоже, что из свободного смысла мы можем "связывать А с В", а затем мы можем сказать: "А связан с В", а это означает, что изменения в В будут отражены в А - автоматически, без пользователь беспокоится о необходимости создания наблюдателя, но наблюдатель настраивается ранее автоматически и автоматически уведомляется об изменении B.

И когда мы это делаем, мы создаем "привязку".

И с более строгим смыслом кажется, что Cocoa и Objective-C определяют его следующим образом: привязка - это свойство foo объекта A, и это свойство наблюдает и изменяется к значению свойства bar объекта B. Как это происходит, нам все равно, и он должен быть скрыт (как черный ящик), и обычно он реализуется с помощью шаблона Observer. Таким образом, слово "привязка" на самом деле означает "свойство", а не действие, и это свойство наблюдает и изменяется на то же значение, что и другое свойство.

И эта привязка не ограничивается элементами UI, связанными с данными. Он может быть внешним, большим элементом пользовательского интерфейса, который содержит меньшую часть элемента пользовательского интерфейса, а внешний элемент пользовательского интерфейса имеет свойство, связанное со свойством внутреннего элемента интерфейса. Или это может быть одно свойство данных, отличных от UI, связанное с другим свойством данных, отличным от UI.

Это то, что такое привязка? А как насчет живой привязки?

Ответы

Ответ 1

Я не уверен в истории, но я предполагаю, что термин "привязка" в этом смысле возник из термина "привязка данных" . "привязка данных" действительно является действием: она заполняет элементы управления пользовательским интерфейсом значениями из фактических данных, модель AKA, например, когда поля в форме заполняются данными из базы данных и автоматически обновляются, используя шаблон Observer, как вы упомянули, Я думаю, что основное отличие от привязки - одностороннее и двустороннее: при двусторонней привязке данных пользовательский ввод также синхронизируется с моделью, а не только синхронизация данных от модели к виду.

"bind" - это глагол, а глагольная форма "привязки данных" будет "привязывать данные" или "выполнять привязку данных". Второй пример демонстрирует, что "привязка данных" также является существительным, которое может быть определено как "акт привязки свойств данных/модели к свойствам UI/view". Что касается существительной версии "привязки", я думаю, вы правы, что обычно это относится к индивидуальной привязке между двумя свойствами. Чтобы продемонстрировать это визуально, предположим, что точки представляют два свойства, которые связаны друг с другом:

• ----- •

"Связывание" здесь - это линия между ними.

Чтобы уточнить, односторонняя привязка может быть представлена ​​одной стрелкой:

• ---- > •

И двусторонняя привязка с двумя стрелками:

• < --- >

"живое связывание" - это термин, который просто используется для указания того, что используется шаблон Observer. Мое предположение было бы в том, что желание отличить "привязку к жизни", вероятно, исходило от веб-разработчиков, которые ранее работали с фреймворками, где привязка данных происходила только один раз для HTTP-запроса, когда страница сначала загружалась. Теперь, когда Javascript-тяжелые веб-приложения становятся нормой (частично благодаря ajax), нет оснований не использовать шаблон Observer, как было предложено в первоначальном определении MVC, поэтому "живая привязка", вероятно, является ненужным термином в отношении RIA или родные настольные или мобильные приложения.

Как и в оригинале, Trygve Reenskaug оригинальное видение MVC (он его изобрел) в основном отражает отражение ментальной модели конечного пользователя в системе, так что "Модель" - это то, что пользователь почти манипулирует напрямую (или, по крайней мере, чувствует таким образом, пользователю). Таким образом, шаблон Observer (или, по крайней мере, некоторый механизм для сохранения модели и представления в синхронизации без перезагрузки страницы) имеет для этого существенное значение, а рамки веб-разработки, которые имеют большую часть кода на стороне сервера, на самом деле не MVC, как изначально задумывалось, но скорее вариант, который следует той же общей идее с точки зрения организации кода. Современные рамки Javascript для приложений на стороне клиента делают реальный MVC возможным для веб-разработки.

Вернемся к тому, что вы задали в своем вопросе, я думаю, вы также правы, когда говорите, что привязка не обязательно находится только между свойством model и свойством view; это может быть между двумя свойствами модели (обычно на разных моделях) или между двумя свойствами представления. Но я бы не согласился с вашим утверждением, что "привязка" является только существительным в отношении программирования - очевидно, на английском языке это существительное формы глагола "bind", другими словами "акт привязки", и я считаю, что действительный использование в программировании. Поэтому, по сути, я говорю о том, что он имеет двойной смысл, но я думаю, что определение, которое вы предложили, является наиболее распространенным. Здесь моя попытка формального определения:

Binding.

  • Связь между двумя свойствами (обычно в двух разных объектах), которая сохраняет свойства в синхронизации друг с другом, т.е. имеет одинаковое значение. Синхронизация может быть либо однонаправленной, либо двунаправленной.
  • Активация такого соединения.

Ответ 2

Связывание в очень простом смысле означает ссылку, предположим, что у вас есть индикатор выполнения и переменная X, каждый раз, когда вы нажимаете кнопку, значение X увеличивается. используя Binding, вы можете принимать значение X (каждый раз, когда он увеличивается) и показывать его на индикаторе выполнения. В следующей строке кода в С# "pb" находится индикатор прогресса, а TapCount - это переменная, в которой сохраняются общие метчики. Он показывает, что значение "pb" связано с переменной TapCount

public void tapping
{    
 pb.Value = TapCount; 
}

Ответ 3

Это не отличается от первоначального использования метода .bind в vanilla javascript: вы связываете область действия объекта с методом.

Рассмотрим this.iterable.map( this.flush ) и this.iterable.map( this.flush.bind(this)). Во-первых, мы просто запускаем метод при каждом взаимодействии итеративного свойства на этом, но для того, чтобы метод this.flush получил доступ к свойству this, вы должны привязать его к this.

Таким же образом, в таких системах, как Ember, модель является декларацией. Чтобы заполнить эту модель из удаленного источника, вам нужен экземпляр. Чтобы изменить модель с рулей, вам нужен экземпляр. Если ваш пользовательский интерфейс сразу же влияет на экземпляр модели - они связаны.

Псевдо-код: UI.view.bind(modelInstance) RemoteSource.bind(modelInstance)

"Live-Binding", по моему опыту, является привязкой данных к удаленному источнику сразу после изменения пользовательского интерфейса.

Псевдо-код: UI.view.bind(modelInstance) RemoteSource.bind(modelInstance) modelInstance.onChange(RemoteSource.update.bind(modelInstance))