Impeça que o AngularJs use a biblioteca jQuery

Pergunta : Como posso evitar que o jQuery seja usado pelo AngularJs?

Fundo :

Estou desenvolvendo um aplicativo independente no AngularJs que pode ser “inserido” em sites de clientes já existentes.

Esses sites de clientes provavelmente já usam o jQuery.

Se você já usou o AngularJs, provavelmente já sabe que ele usa o jqLite (um subconjunto do jQuery). Mas se a biblioteca jQuery for carregada antes de um aplicativo Angular ser inicializado, o Angular usará isso. Não há garantia de que os clientes irão carregá-lo depois.

Usando jQuery em vez da biblioteca jqLite causou outros problemas e eu simplesmente não preciso de jQuery.

Existe uma maneira de evitar que o AngularJs o use e apenas se atenha ao jqLite?

obrigado


EDIT 1 :

Os problemas que obtenho ao permitir que o angular inclua e use o jQuery são:

  1. “GET http://localhost.dev/angular/js/jquery-1.10.2.js?_=1401232704848 404 (Não encontrado)”

  2. “Untaught SyntaxError: Token inesperado <" (erro no arquivo jQuery v2.1.1, linha 330)

Estou testando com o jQuery-2.1.1, então nem tenho certeza do porque ele está procurando pela versão 1.10.2

EDIT 2 :

Eu estou depois de um método que preferencialmente não requer modificações no arquivo AngularJs do núcleo.

ATUALIZAR:
Desde a v1.4.0-beta.6, o Angular agora tem suporte embutido para escolher não usar o jQuery (ou usar uma versão específica se várias versões forem carregadas): ngJq


Infelizmente, não há uma maneira integrada de desabilitar o jQuery (embora pareça um recurso bastante razoável).

Duas longe das soluções ideais seriam:

1.) Solução de Tyler de modificar a fonte angular.

2.) Como angular usa window.jQuery para procurar … você adivinhou … jQuery (e supondo que você pode controlar qual script é executado antes e depois de angular.js), você pode temporariamente “ocultar” jQuery do Angular:

 /* Run before angular.js */ if (window.jQuery) { window.hideJQuery = window.jQuery; window.jQuery = false; } //  if (window.hideJQuery) { window.jQuery = window.hideJQuery; window.hideJQuery = undefined; } 

Use a diretiva ng-jq :

 * @element ANY
  * @param {string =} ngJq o nome da biblioteca disponível em `window`
  * para ser usado no angular.element
  * @descrição
  * Use esta diretiva para forçar a biblioteca angular.element.  Isso deve ser
  * usado para forçar o jqLite deixando ng-jq em branco ou configurando o nome de
  * a variável jquery na janela (por exemplo, jQuery).
  *
  * Como o angular procura esta diretiva quando ela é carregada (não espera pelo
  * Evento DOMContentLoaded), ele deve ser colocado em um elemento que vem antes do script
  * que carrega angular.  Além disso, apenas a primeira instância de `ng-jq` será usada e todos
  * outros ignorados.

Por exemplo:

    ... ...  

Eu acho que se você carregar a biblioteca jquery depois que o angular for inicializado, ele usará o jqlite. Você pode tentar alterar a ordem na qual os arquivos são carregados e inicializados.

Também da versão 1.4.x angular você pode desabilitar o carregamento de jquery usando ng-jq onde seu aplicativo de raiz angular é declarado.

Você pode consultar a documentação do ng-jq aqui: https://code.angularjs.org/1.4.5/docs/api/ng/directive/ngJq

A function abaixo é aquela que está substituindo jqlite por jQuery em Angular. Encontre e altere esta function conforme apropriado na fonte NG para não usar o jQuery.

 function bindJQuery() { var originalCleanData; // bind to jQuery if present; jQuery = window.jQuery; // Use jQuery if it exists with proper functionality, otherwise default to us. // Angular 1.2+ requires jQuery 1.7.1+ for on()/off() support. if (jQuery && jQuery.fn.on) { jqLite = jQuery; extend(jQuery.fn, { scope: JQLitePrototype.scope, isolateScope: JQLitePrototype.isolateScope, controller: JQLitePrototype.controller, injector: JQLitePrototype.injector, inheritedData: JQLitePrototype.inheritedData }); originalCleanData = jQuery.cleanData; // Prevent double-proxying. originalCleanData = originalCleanData.$$original || originalCleanData; // All nodes removed from the DOM via various jQuery APIs like .remove() // are passed through jQuery.cleanData. Monkey-patch this method to fire // the $destroy event on all removed nodes. jQuery.cleanData = function(elems) { for (var i = 0, elem; (elem = elems[i]) != null; i++) { jQuery(elem).triggerHandler('$destroy'); } originalCleanData(elems); }; jQuery.cleanData.$$original = originalCleanData; } else { jqLite = JQLite; } angular.element = jqLite; } 

Deve estar na linha 1432.