Шина Bacon.js является отличным способом публикации и подписки на потоки событий по одному унифицированному каналу. Bus помогает разработчику отделить приложение и делает код намного чище.
Bacon.js Пример автобуса
В этом примере выводится состояние каждого валидатора на html-страницу. Это показывает простой пример публикации / подписки с Bacon.js.
Для начала нам понадобятся несколько скриптов — JQuery, Bacon.js и Bacon.UI.js.
<html>
<head>
<title>Bacon.js example</title>
<script type="text/javascript" src="http://code.jquery.com/jquery-1.8.3.js"></script>
<script type="text/javascript" src="https://raw.github.com/raimohanska/bacon.js/master/dist/Bacon.min.js"></script>
<script type="text/javascript" src="https://raw.github.com/raimohanska/Bacon.UI.js/master/Bacon.UI.js"></script>
Это фактический код Javascript. Я собираюсь провести вас через это.
<script type="text/javascript">
var BUTTON_MESSAGE = "button";
var NAME_MESSAGE = "name";
var AGE_MESSAGE = "age";
var bus = new Bacon.Bus();
$(function () {
bus.ofType = function (type) {
return bus.filter(function (message) {
return message.message == type;
})
}
createFormValidators();
bus.ofType(NAME_MESSAGE)
.merge(bus.ofType(AGE_MESSAGE))
.onValue(function(value){
$("#fields")
.append(value.message + "=" + value.value + "
");
})
bus.ofType(BUTTON_MESSAGE).onValue(function(value){
$("#validations").append(value.value + "
")
})
})
function createFormValidators() {
var nameEntered = Bacon.UI.textFieldValue($("#name input")).map(nonEmpty);
var ageEntered = Bacon.UI.textFieldValue($("#age input")).map(nonEmpty);
var buttonEnabled = nameEntered.and(ageEntered);
buttonEnabled.not().assign($("#submitButton button"), "attr", "disabled");
attachStreamValue(NAME_MESSAGE, nameEntered);
attachStreamValue(AGE_MESSAGE, ageEntered);
attachStreamValue(BUTTON_MESSAGE, buttonEnabled);
}
function nonEmpty(s) {return s.length > 0}
function attachStreamValue(message, eventStream){
eventStream.onValue(function(value){
bus.push({message:message, value:value});
})
}
</script>
Сначала мы определяем ключи, которые используются, чтобы указать, какое значение перемещается в шине. Издатель добавляет ключ к сообщению, а подписчик слушает, используя ключ.
Мы инициализируем новый Bacon.Bus (), который используется как Bus. Определяли новое динамическое свойство типа для шины. Свойство используется для фильтрации правильных сообщений для тех, кто когда-либо слушал.
Затем мы создаем валидаторы форм. Начало такое же, как в предыдущем посте Bacon.js . После этого мы публикуем в шину значения потока имен, возраста и кнопки. Сообщение доставляется постоянно, пока пользователь взаимодействует.
После этого мы подписываемся на имя и возраст, используя наши ключи NAME_MESSAGE и AGE_MESSAGE . Они передаются в качестве параметра нашему динамическому свойству типа . Мы также используем слияние, которое позволяет пользователю объединить два потока в один. Тогда мы просто добавляем значение в разметку.
Последний шаг — подписаться на валидацию кнопки, которая сообщает нам, действительна ли вся форма. Это также написано для разметки.
Вот статический HTML, который мы используем в этом примере Bacon.js.
</head>
<body>
<h1>Bacon.js POW!</h1>
<div id="name">
Name: <input type="text">
</div>
<div id="age">
Age: <input type="text">
</div>
<div id="submitButton">
<button>Submit</button>
</div>
<div style="position:relative; float:left;">
<h4>Combined Validation result:</h4>
<span id="validations"></span>
</div>
<div style="position:relative; float:left;margin-left:5em">
<h4>Field validation result:</h4>
<span id="fields"></span>
</div>
</body>
</html>
Bacon Bus — очень простой механизм публикации / подписки. Его можно использовать от полноценной прикладной шины до простого обмена сообщениями.