Ненавязчивый нокаут
Я недавно освоился с Knockout и считаю, что это фантастическая структура. Однако у меня есть одна проблема.
Я обнаружил, что в нетривиальных случаях связывания у меня появляются фрагменты кода javascript, попадающие в мое представление (разметка). На самом деле довольно много примеров кода в документации Knockout также демонстрируют это.
Делает ли это нокаут по своей природе навязчивым?
Должен ли я просто принять это таким, какой он есть, и не беспокоиться на практике?
Или есть какие-то шаблоны / методы, которые я должен использовать, чтобы сделать нокаут незаметным?
5 ответов
Отличный вопрос Я некоторое время писал сложные представления KnockoutJS и никогда не был доволен, пока не переключился на поставщика связывания классов Райана Нимейера.
Knockout ClassBindingProvider позволяет вам объявлять ваши привязки в объекте JavaScript, а затем ссылаться на них из data-class
Атрибут похож на то, как работают классы CSS. Работает отлично!
Смотрите пример приложения TodoMVC.
Старайтесь держать Javascript вне привязок и используйте его только для метаданных.
так вместо того, чтобы делать
<span data-bind="visible: errors().length > 0">You have errors</span>
Используйте вычисляемую наблюдаемую
<span data-bind="visible: hasErrors">You have errors</span>
Обновление: я продолжил и создал Соглашение по конфигурации API для KO. Его можно найти здесь https://github.com/AndersMalmgren/Knockout.BindingConventions/wiki
Вместо того чтобы делать <button data-bind="click: save">Save</button>
ты делаешь <button data-name="save">Save</button>
, По соглашению библиотека поймет, что вы хотите подключить функцию сохранения к обработчику нажатий кнопок. По соглашению он также связывает enable, если присутствует член canSave. http://jsfiddle.net/3Ajnj/15/
Должен ли я просто принять это таким, какой он есть, и не беспокоиться на практике?
Я понимаю, что "ненавязчивый" означает несколько разных вещей.
Одним из аспектов "ненавязчивости" является то, что веб-сайты должны поддерживать базовую функциональность в браузерах с ограниченной поддержкой JavaScript или вообще без поддержки. С этой целью ваша забота об этом принципе должна зависеть от вашей целевой аудитории. Я работал над проектами, в которых я достаточно хорошо знал свою целевую аудиторию, поэтому я имел возможность сказать: "Если вы хотите воспользоваться этим веб-приложением, используйте современный браузер, такой как Chrome, с включенным JavaScript". В этом случае, не стесняйтесь сходить с ума с последними, удивительными интерфейсными рамками там.
Я работал над другими проектами, где это было не так, и мы должны были быть очень осторожны с использованием таких сред, как Knockout. Если вы сильно полагаетесь на Knockout для выполнения основных функций в вашем приложении, то ваше приложение по своей природе навязчиво. Должно ли это вас беспокоить, зависит от вашей целевой аудитории.
Еще один принцип "ненавязчивого JS" - это разделение проблем между JavaScript и HTML. Я действительно спорю, насколько строго важен этот принцип. Я думаю, что более важный принцип - это разделение проблем между логикой модели представления и логикой отображения в соответствии с шаблоном MVVM. Knockout проделывает фантастическую работу по поощрению четкого разделения интересов view/vm, даже если вы добавили немного логики JavaScript в свои привязки данных. Пока это строго логика взгляда, я думаю, что это на самом деле принадлежит взгляду.
Я рекомендую вам посетить блог Райана и прочитать: "Упрощение и очистка просмотров в KnockoutJS", если вы еще этого не сделали...
http://www.knockmeout.net/2011/08/simplifying-and-cleaning-up-views-in.html
Он объясняет несколько хороших способов рефакторинга вашего кода, поэтому он не загромождает HTML и делает его более чистым.
Альтернативой провайдеру связывания, предложенному в выбранном ответе, является https://github.com/stevenbey/knockout.unobtrusiveBindingProvider, который является "ненавязчивым провайдером связывания на основе соглашений для Knockout JS, который обеспечивает чистое разделение привязок данных HTML и Knockout".