Механизм 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.DeferredTokenbasis.l10n.Tokenbasis.template.SourceWrapper;класс basis.data.value.BindValue и его потомки:
basis.data.value.Propertybasis.data.value.ObjectSetbasis.data.value.Expressionbasis.data.index.Indexbasis.data.index.Countbasis.data.index.Sumbasis.data.index.Avgbasis.data.index.Minbasis.data.index.Maxкласс basis.template.Template и его потомок basis.template.html.Template