Что делает AngularJS лучше, чем jQuery?

В основном я использую библиотеку jQuery и только что начал использовать AngularJS. Я прочитал несколько руководств о том, как использовать Angular, но я не понимаю, почему и когда его использовать, или какие преимущества я могу найти по сравнению с использованием только jQuery.

Мне кажется, что Angular заставляет вас думать о MVC, что, возможно, означает, что вы просматриваете свою веб-страницу в виде комбинации шаблонов + данных. Вы используете {{data bindings}}, когда вы чувствуете, что у вас будут динамические данные. Angular затем предоставит вам обработчик $scope, который вы можете заполнить статически или через вызовы на веб-сервер. Это похоже на характер JSP-метода проектирования веб-страниц. Мне нужно Angular для этого?

Для простой манипуляции с DOM, которая не связана с манипулированием данными (например, изменение цвета на мыши, скрытие/отображение элементов при щелчке), jQuery или vanilla JS является достаточным и более чистым. Это предполагает, что модель в Angular mvc - это все, что отражает данные на странице, и, следовательно, свойства CSS, такие как изменения цвета, отображения/скрытия и т.д., Не влияют на модель. Имеет ли Angular какие-либо преимущества перед jQuery или vanilla JS для манипуляций с DOM?

Что может сделать Angular, что делает его полезным для разработки по сравнению с тем, что jQuery может делать вместе с плагинами?

Ответ 1

привязки данных

Вы идете вокруг своей веб-страницы и продолжаете класть {{данные bindings}} всякий раз, когда вы чувствуете, что у вас будут динамические данные. Angular будет затем предоставит вам обработчик $scope, который вы можете заполнить (статически или через вызовы на веб-сервер).

Это хорошее понимание привязки данных. Я думаю, что у тебя все получилось.

Манипуляция DOM

Для простых манипуляций с DOM, которые не связаны с манипуляциями данными (например: изменение цвета на мыши, скрытие/отображение элементов при нажатии), jQuery или old-school js является достаточным и более чистым. Это предполагает, что модель в Angular mvc - это все, что отражает данные на странице, и, следовательно, свойства css, такие как цвет, отображение/скрытие и т.д. влияют на модель.

Я вижу здесь вашу точку зрения о том, что "простые" манипуляции DOM являются более чистыми, но только реже, и это должно быть действительно "простым". Я думаю, что манипуляция DOM - это одна из областей, как привязка данных, где Angular действительно сияет. Понимание этого также поможет вам увидеть, как Angular рассматривает свои представления.

Начну с сравнения Angular с ванильным js-подходом к манипулированию DOM. Традиционно мы думаем о HTML как о том, что "ничего не делаем" и не пишем его как таковой. Таким образом, встроенные js, такие как "onclick" и т.д., Являются плохой практикой, потому что они помещают "делать" в контексте HTML, что не "делает". Angular переворачивает эту концепцию на голове. Когда вы пишете свое мнение, вы думаете о том, что HTML может "делать" много вещей. Эта способность абстрагируется в директивах Angular, но если они уже существуют или вы их написали, вам не нужно рассматривать "как" это делается, вы просто используете силу, доступную вам в этом "дополненном" HTML, который позволяет использовать Angular. Это также означает, что ВСЕ логика вашего представления действительно содержится в представлении, а не в ваших файлах javascript. Опять же, аргументация состоит в том, что директивы, написанные в ваших файлах javascript, могут рассматриваться как увеличивающие возможности HTML, поэтому вы позволяете DOM беспокоиться о том, чтобы манипулировать собой (так сказать). Я продемонстрирую на простом примере.

Это разметка, которую мы хотим использовать. Я дал ему интуитивное имя.

<div rotate-on-click="45"></div>

Во-первых, я просто хотел бы прокомментировать, что если мы предоставили нашей HTML эту функцию с помощью специальной Angular директивы, мы уже сделали. Это глоток свежего воздуха. Подробнее об этом через мгновение.

Реализация с помощью jQuery

живая демонстрация здесь (нажмите).

function rotate(deg, elem) {
  $(elem).css({
    webkitTransform: 'rotate('+deg+'deg)', 
    mozTransform: 'rotate('+deg+'deg)', 
    msTransform: 'rotate('+deg+'deg)', 
    oTransform: 'rotate('+deg+'deg)', 
    transform: 'rotate('+deg+'deg)'    
  });
}

function addRotateOnClick($elems) {
  $elems.each(function(i, elem) {
    var deg = 0;
    $(elem).click(function() {
      deg+= parseInt($(this).attr('rotate-on-click'), 10);
      rotate(deg, this);
    });
  });
}

addRotateOnClick($('[rotate-on-click]'));

Реализация с Angular

живая демонстрация здесь (нажмите).

app.directive('rotateOnClick', function() {
  return {
    restrict: 'A',
    link: function(scope, element, attrs) {
      var deg = 0;
      element.bind('click', function() {
        deg+= parseInt(attrs.rotateOnClick, 10);
        element.css({
          webkitTransform: 'rotate('+deg+'deg)', 
          mozTransform: 'rotate('+deg+'deg)', 
          msTransform: 'rotate('+deg+'deg)', 
          oTransform: 'rotate('+deg+'deg)', 
          transform: 'rotate('+deg+'deg)'    
        });
      });
    }
  };
});

Довольно светлый, ОЧЕНЬ чистый и просто простая манипуляция. По моему мнению, подход Angular выигрывает во всех отношениях, особенно в том, как абстрагироваться функциональность и манипулировать dom DOM. Функциональность привязана к элементу через атрибут html, поэтому нет необходимости запрашивать DOM с помощью селектора, и у нас есть два прекрасных закрытия - одно закрытие для директивы factory, где переменные распределены во всех режимах использования директива и одно закрытие для каждого использования директивы в функции link (или compile).

Двусторонняя привязка данных и директивы для манипуляций с DOM - это только начало того, что делает Angular потрясающим. Angular способствует тому, что весь код является модульным, многоразовым и легко проверяемым, а также включает в себя одностраничную систему маршрутизации приложений. Важно отметить, что jQuery - это библиотека часто используемых методов удобства/кросс-браузера, но Angular - полнофункциональная среда для создания одностраничных приложений. Angular script фактически включает в себя свою собственную "облегченную" версию jQuery, так что доступны некоторые из наиболее важных методов. Поэтому вы можете утверждать, что с помощью Angular IS с помощью jQuery (слегка), но Angular обеспечивает гораздо больше "магии", чтобы помочь вам в процессе создания приложений.

Это отличный пост для получения дополнительной информации: Как мне "думать в AngularJS" , если у меня есть фон jQuery?

Общие отличия.

Вышеуказанные пункты направлены на конкретные проблемы OP. Я также расскажу о других важных отличиях. Я также предлагаю прочитать дополнительную информацию о каждой теме.

Angular и jQuery не может быть разумно сравним.

Angular - это фреймворк, jQuery - это библиотека. Рамки имеют свое место, и библиотеки имеют свое место. Однако нет сомнений в том, что хорошая структура имеет больше возможностей при написании приложения, чем в библиотеке. Это точно точка рамки. Вы можете написать свой код в простой JS или добавить в библиотеку общих функций или добавить фреймворк, чтобы значительно сократить код, необходимый для выполнения большинства задач. Поэтому более подходящий вопрос:

Зачем использовать фреймворк?

Хорошие фреймворки могут помочь архитектовать ваш код так, чтобы он был модульным (поэтому многократно используемым), сухим, читаемым, эффективным и безопасным. jQuery не является основой, поэтому в этом не помогает. Мы все видели типичные стены кода спагетти jQuery. Это не ошибка jQuery - это ошибка разработчиков, которые не знают, как архитектовать код. Однако, если разработчики знали, как архитектовать код, они в конечном итоге написят какую-то минимальную "фреймворк", чтобы обеспечить основу (архитектуру и т.д.), Которые я обсуждал минуту назад, или они что-то добавили. Например, вы может добавить RequireJS, чтобы действовать как часть вашей структуры для написания хорошего кода.

Вот некоторые вещи, которые предоставляют современные рамки:

  • Шаблонирование
  • привязки данных
  • маршрутизация (одностраничное приложение)
  • чистая, модульная, многоразовая архитектура.
  • Безопасность
  • дополнительные функции/функции для удобства

Прежде чем продолжить обсуждение Angular, я хотел бы указать, что Angular не единственный в своем роде. Например, Durandal - это структура, построенная поверх jQuery, Knockout и RequireJS. Опять же, jQuery не может сам по себе предоставить то, что могут быть Knockout, RequireJS и вся структура, построенная сверху. Это просто не сравнимо.

Если вам нужно уничтожить планету, и у вас есть Звезда Смерти, используйте звезду Смерти.

Angular (повторно).

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

Ссылка DOM.

В моем примере выше просто абсолютно неизбежно, что jQuery должен подключаться к DOM, чтобы обеспечить функциональность. Это означает, что представление (html) связано с функциональностью (поскольку на нем помечен какой-то идентификатор, например "слайдер изображения" ), и JavaScript обеспокоен предоставлением этой функциональности. Angular устраняет эту концепцию с помощью абстракции. Правильно написанный код с Angular означает, что представление может объявить свое собственное поведение. Если я хочу отображать часы:

<clock></clock>

Готово.

Да, нам нужно перейти на JavaScript, чтобы это означало что-то, но мы делаем это в обратном порядке подхода jQuery. Наша директива Angular (которая находится в ней собственного маленького мира) имеет "расширенный" html, а html перехватывает функциональность в себе.

MVW Architecure/Modules/Injection Dependency

Angular дает вам простой способ структурирования вашего кода. Просмотреть элементы относятся к представлению (html), расширенная функциональность представления относится к директивам, другая логика (например, ajax-вызовы), а функции принадлежат сервисам, а подключение служб и логики к виду принадлежит контроллерам. Существуют и другие компоненты Angular, которые помогают справиться с настройкой и модификацией сервисов и т.д. Любая функциональность, которую вы создаете, автоматически доступна в любом месте, где она вам нужна, через подсистему Injector, которая заботится об Injection Dependency во всем приложении. При написании приложения (модуля) я разбиваю его на другие модули многократного использования, каждый со своими компонентами многократного использования, а затем включаю их в более крупный проект. После того, как вы решите проблему с Angular, вы автоматически решили ее таким образом, чтобы это было полезно и структурировано для повторного использования в будущем и легко включалось в следующий проект. ОГРОМНЫЙ бонус ко всему этому заключается в том, что ваш код будет намного легче тестировать.

Нелегко заставить вещи "работать" в Angular.

БЛАГОДАРНОСТЬ. Вышеупомянутый код спагетти jQuery произошел от разработчика, который сделал что-то "работа", а затем перешел. Вы можете написать плохой код Angular, но сделать это намного сложнее, потому что Angular будет бороться с вами. Это означает, что вы должны использовать (по крайней мере, немного) чистую архитектуру, которую она предоставляет. Другими словами, сложнее записать плохой код с помощью Angular, но удобнее писать чистый код.

Angular далек от совершенства. Мир веб-разработки постоянно растет и меняется, и для решения проблем возникают новые и лучшие способы. Facebook React и Flux, например, имеют большие преимущества перед Angular, но имеют свои недостатки. Ничего не идеального, но Angular был и остается потрясающим на данный момент. Подобно тому, как jQuery когда-то помогал веб-миру продвигаться вперед, то есть Angular, и так будет много.