Ei, estou construindo uma página da web com angular. O problema é que já existem coisas construídas sem angular e tenho que incluí-las também
O problema é este.
Tenho algo assim no meu main.html:
<ngInclude src="partial.html">
</ngInclude>
E meu partial.html tem algo assim
<h2> heading 1 <h2>
<script type="text/javascript" src="static/js/partial.js">
</script>
E meu partial.js não tem nada a ver com angularjs. nginclude funciona e posso ver o html, mas não consigo ver o arquivo javascript sendo carregado. Eu sei como usar o firebug / chrome-dev-tool, mas não consigo nem ver a solicitação de rede sendo feita. O que estou fazendo errado?
Eu sei que angular tem algum significado especial para tag de script. Posso substituí-lo?
Resposta curta: AngularJS ("jqlite") não suporta isso. Inclua jQuery em sua página (antes de incluir Angular) e deve funcionar. Consulte https://groups.google.com/d/topic/angular/H4haaMePJU0/discussion
fonte
Eu tentei a abordagem do Neemzy, mas não funcionou para mim usando 1.2.0-rc.3. A tag de script seria inserida no DOM, mas o caminho javascript não seria carregado. Suspeito que seja porque o javascript que eu estava tentando carregar era de um domínio / protocolo diferente. Então eu peguei uma abordagem diferente, e é isso que eu inventei, usando o google maps como exemplo: ( Síntese )
angular.module('testApp', []). directive('lazyLoad', ['$window', '$q', function ($window, $q) { function load_script() { var s = document.createElement('script'); // use global document since Angular's $document is weak s.src = 'https://maps.googleapis.com/maps/api/js?sensor=false&callback=initialize'; document.body.appendChild(s); } function lazyLoadApi(key) { var deferred = $q.defer(); $window.initialize = function () { deferred.resolve(); }; // thanks to Emil Stenström: http://friendlybit.com/js/lazy-loading-asyncronous-javascript/ if ($window.attachEvent) { $window.attachEvent('onload', load_script); } else { $window.addEventListener('load', load_script, false); } return deferred.promise; } return { restrict: 'E', link: function (scope, element, attrs) { // function content is optional // in this example, it shows how and when the promises are resolved if ($window.google && $window.google.maps) { console.log('gmaps already loaded'); } else { lazyLoadApi().then(function () { console.log('promise resolved'); if ($window.google && $window.google.maps) { console.log('gmaps loaded'); } else { console.log('gmaps not loaded'); } }, function () { console.log('promise rejected'); }); } } }; }]);
Espero que seja útil para alguém.
fonte
Usei esse método para carregar um arquivo de script dinamicamente (dentro de um controlador).
var script = document.createElement('script'); script.type = 'text/javascript'; script.src = "https://maps.googleapis.com/maps/api/js"; document.body.appendChild(script);
fonte
Isso não funcionará mais a partir de 1.2.0-rc1. Consulte este problema para obter mais informações, no qual postei um comentário descrevendo uma solução alternativa rápida. Vou compartilhar aqui também:
// Quick fix : replace the script tag you want to load by a <div load-script></div>. // Then write a loadScript directive that creates your script tag and appends it to your div. // Took me one minute. // This means that in your view, instead of : <script src="/path/to/my/file.js"></script> // You'll have : <div ng-load-script></div> // And then write a directive like : angular.module('myModule', []).directive('loadScript', [function() { return function(scope, element, attrs) { angular.element('<script src="/path/to/my/file.js"></script>').appendTo(element); } }]);
Não é a melhor solução de todas, mas ei, nem é colocar tags de script em visualizações subsequentes. No meu caso, tenho que fazer isso para usar o Facebook / Twitter / etc. widgets.
fonte
ocLazyLoad permite carregar scripts de forma preguiçosa nos modelos / visualizações por meio de roteadores (por exemplo, ui-router). Aqui está um sniplet
$stateProvider.state('parent', { url: "/", resolve: { loadMyService: ['$ocLazyLoad', function($ocLazyLoad) { return $ocLazyLoad.load('js/ServiceTest.js'); }] } }) .state('parent.child', { resolve: { test: ['loadMyService', '$ServiceTest', function(loadMyService, $ServiceTest) { // you can use your service $ServiceTest.doSomething(); }] } });
fonte
Para carregar dinamicamente o recaptcha de um
ui-view
, uso o seguinte método:Em
application.js
:.directive('script', function($parse, $rootScope, $compile) { return { restrict: 'E', terminal: true, link: function(scope, element, attr) { if (attr.ngSrc) { var domElem = '<script src="'+attr.ngSrc+'" async defer></script>'; $(element).append($compile(domElem)(scope)); } } }; });
Em
myPartial.client.view.html
:<script type="application/javascript" ng-src="http://www.google.com/recaptcha/api.js?render=explicit&onload=vcRecaptchaApiLoaded"></script>
fonte
$(element)
por que você precisa da$()
sintaxe. da documentação ajs 'Todas as referências de elemento em Angular são sempre agrupadas com jQuery ou jqLite' (como o argumento de elemento na função de compilação / link de uma diretiva) - portanto, a partir dessa e de minhas outras experiências - esperava que você usasse o elemento '. append (...) `- embora eu acabe não sendo o que eu poderia usar no final - ao testar eu fiquei confuso quando vi essa parte e não funcionou para mim quando tentei funcionar apenas com o 'element.append' sintaxeInfelizmente, todas as respostas neste post não funcionaram para mim. Eu continuei recebendo o seguinte erro.
Descobri que isso acontece se você usar alguns widgets de terceiros (demandforce no meu caso) que também chamam arquivos JavaScript externos adicionais e tenta inserir HTML. Olhando para o console e o código JavaScript, percebi várias linhas como esta:
document.write("<script type='text/javascript' "..."'></script>");
Usei arquivos JavaScript de terceiros (htmlParser.js e postscribe.js) de: https://github.com/krux/postscribe . Isso resolveu o problema neste post e corrigiu o erro acima ao mesmo tempo.
(Esta foi uma maneira rápida e suja dentro do prazo apertado que tenho agora. Não me sinto confortável em usar a biblioteca JavaScript de terceiros. Espero que alguém possa encontrar uma maneira mais limpa e melhor.)
fonte
Tentei usar o reCAPTCHA do Google explicitamente. Aqui está o exemplo:
// put somewhere in your index.html <script type="text/javascript"> var onloadCallback = function() { grecaptcha.render('your-recaptcha-element', { 'sitekey' : '6Ldcfv8SAAAAAB1DwJTM6T7qcJhVqhqtss_HzS3z' }); };
//link function of Angularjs directive link: function (scope, element, attrs) { ... var domElem = '<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit" async defer></script>'; $('#your-recaptcha-element').append($compile(domElem)(scope)); }
fonte