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

Прерывистый "Поиск элементов с помощью селекторов не поддерживается jqLite!" при загрузке AngularJS с RequireJS

Загружаю AngularJS через RequireJS. В большинстве случаев проблем нет, но время от времени я получаю сообщение об ошибке:

Неподготовленная ошибка: [jqLite: nosel] Поиск элементов с помощью селекторов не поддерживается jqLite!

Я знаю, что все на самом деле загружается, поэтому проблема не в том, что RequireJS не находит файлы.

Вот моя конфигурация RequireJS:

require.config({
 baseUrl: 'lib/',
 paths: {
   jquery: 'external/jquery-2.1.1',
   angular: 'external/angular',
 },
 shim: {
   angular: {
       exports: "angular"
   },
 },
});

Вот как я загружаю RequireJS и запускаю загрузку:

<script type="text/javascript" src="lib/requirejs/require.js"></script>
<script type="text/javascript" src="requirejs-config.js"></script>
<script>
  require(["start"]);
</script>

Я использую AngularJS 1.3.0 и RequireJS 2.1.15.

4b9b3361

Ответ 1

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

Проблема заключается в том, что AngularJS использует только jQuery. Если он присутствует, то AngularJS использует его. Если он отсутствует, то AngularJS будет использовать библиотеку jqLite, связанную с AngularJS, которая поддерживает подмножество того, что может сделать jQuery. Важным отличием является то, что оператор вроде:

angular.element('[ng-controller="something"]')

будет работать только в том случае, если jQuery доступен для AngularJS и не будет работать, если вместо этого используется jqLite. Если RequireJS загружает AngularJS перед jQuery, то AngularJS будет работать без jQuery, и инструкция не будет выполнена.

Это можно устранить, изменив настройку AngularJS:

 shim: {
   angular: {
       deps: ['jquery'],
       exports: "angular"
   },
 },

Ответ 2

Если вы не хотите зависеть от jQuery, тогда при условии, что вы можете обеспечить версию браузера вместо

angular.element('.mySelector');

использование

angular.element(document.querySelector('.mySelector'));

Смотрите здесь, чтобы узнать, какие браузеры поддерживают document.querySelector.