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