| Воскресенье, 12 мая, 2013
Метки: Javascript, Knockout Комментарии: 0
Итак, мы рассмотрели простейший случай создания модели представления и отображения ее переменной на странице, используя декларативное связывание. Но одним из ключевых преимуществ библиотеки KO является автоматическое немедленное обновление пользовательского интерфейса при изменении значений модели представления. Как KO узнает, что значение какой-либо переменной в модели представления изменилось? Для этого нужно объявить переменную в объекте как наблюдаемое(observable). Observable-объекты могут уведомлять подписчиков об изменениях и автоматически определять зависимости.
Например, перепишем предыдущую модель представления так:
var myViewModel = { personName: ko.observable('Bob'), personAge: ko.observable(123) };
Представление вообще не нужно модифицировать – те же самые атрибуты data-bind будут работать без проблем. Разница лишь в том, что теперь они способны реагировать на изменения значений в модели представления, и когда они происходят, представление обновляется автоматически.
Для совместимости со всеми браузерами ko.observable объекты реализованы как функции.
Весь смысл наблюдаемых переменных в том, что некоторый код получает уведомления об изменениях значений свойств модели. Многие встроенные связывания KO делают это незаметно внутри самой библиотеки. Когда разработчик добавляет атрибут data-bind="text: personName", то это связывание регистрирует себя для получения уведомлений об изменении переменной personName (здесь предполагается, что personName - observable).
Если изменить значение переменной вызовом функции myViewModel.personName('Mary'), то связывание text автоматически обновит текстовое содержимое соответствующего DOM-элемента. Так изменения в модели представления транслируются в представление.
Обычно не нужно подписываться на уведомления явно, но если возникла такая необходимость, можно зарегистрировать собственную подписку на уведомления от наблюдаемой переменной. Для этого используют функцию subscribe:
myViewModel.personName.subscribe( function(newValue) { alert("Новое имя - " + newValue); });
Для завершения получения уведомлений нужно вызвать функцию dispose у объекта подписки:
var subscription = myViewModel.personName.subscribe( function(newValue) { /* делаем что нибудь */ } ); // ...и потом... subscription.dispose(); // уведомления больше не нужны
В основном, явная подписка используется редко, так как встроенное связывание и система работы с шаблонами делает это автоматически.
Copyright © CodeHint.ru 2013-2025 (v2.4.7 - работает на Angular Universal)Калькулятор инвест-портфеля