Подтвердить что ты не робот

Ненавязчивый нокаут

Недавно я встал, чтобы ускориться с Knockout, и я думаю, что это фантастическая структура. Однако у меня есть одна проблема.

Я нахожу это в нетривиальных случаях связывания, у меня есть фрагменты кода javascript, ползущие в мой взгляд (разметка). На самом деле довольно много примеров кода в документации Knockout также демонстрируют это.

Означает ли это, что нокаут по своей сути навязчивый?

Должен ли я просто принять его за то, что он есть, и не волноваться на практике?

Или существуют ли какие-либо шаблоны/методы, которые я должен использовать, чтобы сделать нокаут ненавязчивым?

4b9b3361

Ответ 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 и нокаутов данных ".