Механизм binding bridge
служит для обеспечения простой связи объектов и односторонней синхронизации некоторого значения между ними. Он позволяет абстрагироваться от конкретной реализации класса (объекта), того, что является значением, как оно хранится, как хранятся, добавляются и удаляются обработчики, срабатывающие на изменение значения.
Считается, что экземпляр (класс) поддерживает данный механизм, если у него есть свойство bindingBridge
, в котором содержится объект. Этот объект является универсальным интерфейсом и должен предоставлять 3 метода:
attach(host, fn, context) - метод для добавления обработчика, где:
detach(host, fn, context) - метод для удаления обработчика;
get(host) - метод, возвращающий значение.
Для корректного удаления обработчика методу
detach
необходимо передавать те же значения, что и методуattach
, они должны быть эквивалентны.
Обработчик вызывается в случае изменения значения, и ему передается единственный аргумент – новое значение. В этот момент bindingBridge.get
должен возвращать то же значение.
var token = new basis.Token(123);
var logChanges = function(value){
console.log('new value is', value, 'and it',
(token.bindingBridge.get(token) === value ? 'equals' : 'not equals'),
'to token.bindingBridge.get(token)');
};
token.bindingBridge.attach(token, logChanges);
token.set(333);
// console> new value is 333 and it equals to token.bindingBridge.get(token)
token.bindingBridge.detach(token, logChanges);
token.set(1);
// в консоль ничего выведено не будет
Может возникнуть вопрос, зачем передавать в метод владельца интерфейса и почему не используется
this
внутри методов интерфейса. Дело в том, что методы интерфейса находятся в объектеbindingBridge
и не будут иметь нужного контекста при обычном вызове. Для задания контекста требуется вызовtoken.bindingBridge.attach.call(token, logChanges)
. Можно заметить, что аргументы остались те же, но добавился.call
. Текущая реализация не требует.call
, и вызов таких методов оказывается немного короче.
Данный интерфейс широко используется в шаблонах.
Интерфейс binding bridge
предоставляют:
ресурсы (специальные функции, произведенные функцией basis.resource
)
класс basis.Token
и его потомки:
basis.DeferredToken
basis.l10n.Token
basis.template.SourceWrapper
;класс basis.data.value.BindValue
и его потомки:
basis.data.value.Property
basis.data.value.ObjectSet
basis.data.value.Expression
basis.data.index.Index
basis.data.index.Count
basis.data.index.Sum
basis.data.index.Avg
basis.data.index.Min
basis.data.index.Max
класс basis.template.Template
и его потомок basis.template.html.Template