All streams
Search
Write a publication
Pull to refresh
26
0
Валерий Зайцев @ZaValera

User

Send message
При работе с большим количеством массивных кусков DOM, выигрыш от использования DocumentFragment и соответственного сокращения количества репейнтов можно измерять секундами.
Каким бы сахаром вы не посыпали ваш код, это не спасет от ошибок, вызванных непониманием базовых основ JavaScript.
{silent: true} отличный инструмент, которой прекрасно справляется со своими задачами. Да, в неумелых руках он может привести к нежелательным последствиям, поэтому разработчики Backbone об этом предупреждают. Зачем мне придумывать лишние флаги, когда это уже заложено в Backbone. А на поздних этапах разработки, когда подписчиков уже достаточное количество, вводить новый флаг и его обработку крайне затратное мероприятие.
А с чего Вы решили, что механизм вычисляемых полей в Ribs реализован через подписки на события?
Кто решает, какие механизмы (реализованные через подписки на события!) считать связанными с подписками, а какие нет?

Я, как автор библиотеки, решаю какие механизмы я буду реализовывать и КАК я их буду реализовывать.
Добавил возможность определения своих типов биндингов. Документация будет позже, а пока просто приведу пример:
Backbone.Ribs.View.extend({
    bindings: {
        '.bind-text': {
            textCustom: 'model.text'
        },
        '.bind-css': {
            cssCustom: {
                'color': 'model.color',
                'font-weight': 'model.weight'
            }
        },
    },

    handlers = {
        textCustom: function ($el, value) {
            $el.text(value);
        },

        cssCustom: {
            set: function ($el, value, key) {
                $el.css(key, value);
            },
            multiple: true
        }
    }
})

Если до появления документации возникнут вопросы, обращайтесь.
Давайте захватим цитату чуть раньше:
if you'd like to prevent the event from being triggered, you may pass {silent: true} as an option.

Если я передаю {silent:true}, я хочу, чтобы не было триггера событий и ничего больше. Ни о какой базовой и дополнительной функциональности речи не идет. Этот флаг нужен исключительно для этого. Если приведенный пример для Вас является нормой, и это ровно то поведение, которое вы ожидаете, то мне нечего добавить. Я считаю такое поведение неправильным и неприемлемым.
И я не разделяю библиотеки на сорта и уж тем более не считаю никого идиотом. У нас с Вами разные взгляды на вещи, и я предлагаю остаться каждому при своем мнении, и закончить эту исчерпавшую себя дискуссию.
рассинхронизируете обычные и вычисляемые поля

А вот этого быть не должно! Вычисляемое поле должно обновиться не зависимо от флага {silent: true}. А иначе вы получаете неконсистентную модель, и из этого вытекают нюансы, когда дергать render и др.
А Вас не смущает, что одни биндинг обновился, а другой нет? Такое поведение ну никак не подходит под «корректно и предсказуемо».
В ribs.js при set-е с {silent: true} ни один биндинг не обновится.
При обычном set-е, соответственно, обновятся оба биндинга.
Вот простейший пример того, что создатели разных библиотек могут относиться к одним и тем же вещам по-разному. К примеру, {silent: true}:
jsfiddle.net/n7Sfp/3/
backbone-nested — проигнорировал {silent: true}
backbone-computedfields — отреагировал на {silent: true} правильно

Такая, казалось бы, мелочь в большом сложном проекта обойдется очень дорого. А если копнуть глубже, то я найду еще примеры «стыковки без швов».
Выбор за вами. Использовать три библиотеки, которые придется еще стыковать друг с другом, или одну, в которой все это связано из коробки.
Добавление своих типов биндингов в самых ближайших планах.
Да, не спорю, это просто пример для наглядности. Но вы можете хранить верстку, где вам удобно, а в js ее получать с помощью require.js, например.
А если вам нужно просто прятать элемент в зависимости от состояния флага, то просто добавляете toggle-биндинг:
bindings: {
    '.js-deleteDevice': {
        toggle: 'model.flag'
    }
}
Могу предложить вот такой вариант. У вас в модели есть некое поле flag, которое отвечает за наличие DOM-элемента в дереве.
В модель добавляем вычисляемое поле:
computeds: {
    template: {
        deps: ['flag'],
        get: function (flag) {
            return flag ? '<button rv-if="device:CanBeRemoved" class="btn-del js-deleteDevice">✖</button>' : '';
        }
    }
}


А во view добавляем биндинг:
bindings: {
    '.some-wrapper': {
        html: 'model.template'
    }
}
Есть html-биндинг — можно вставлять целые куски html-кода в определенный DOM-элемент. Если речь не об этом, то опишите задачу подробнее.
2

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Works in
Registered
Activity