Статьи

Bacon.js — Автобус

Шина 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 — очень простой механизм публикации / подписки. Его можно использовать от полноценной прикладной шины до простого обмена сообщениями.