2016-02-14 4 views
1

Я пытаюсь лениво загрузить директиву в другую директиву, основанную на условии. У меня есть основная директива, и внутри нее у меня есть тег <script>. Включенная директива правильно загружается только при наличии jquery, проблема в том, что не все мои страницы загружают jquery. Существует также второе предупреждение ...Невозможно правильно загрузить внешний скрипт без jquery

синхронный XMLHttpRequest в основной теме устарел.

Который должен быть в состоянии подавить, если я нахожу чистый способ работы с скриптом.

Вот моя установка

<my-directive> 
    <script ng-if="expression" src="../path" type="application/javascript"></script> 
</my-directive> 

очень просто, но это работает только если JQuery есть, чтобы загрузить его. Я попытался загрузить его через запрос $http.get(), а затем eval() (который я знаю об опасности), но это не сработало.

+0

Это _may_ быть, потому что это скрипт тегов. Можете ли вы обернуть «скрипт» в другой элемент, такой как «div», и применить к нему «ng-if»? – Rhumborl

+0

ng-if работает правильно, что не является оценкой содержимого скрипта. Когда я использую jquery, директива регистрирует иначе, просто загружается, но ничего не регистрируется. –

ответ

1

Это способ, который использует подход $http. Вы можете создать директиву, которая добавляет ваш тег <script> для этой функции, проверяя определенный атрибут type. Конечно, вы могли бы изменить эту проверку, но хотите. Обратите внимание на следующее ...

app.directive('script', function($http) { 
    return { 
     restrict: 'E', 
     scope: false, 
     link: function(scope, elem, attrs) { 
      if (attrs.type === 'text/javascript-lazy') { 
       $http.get(attrs.src).then(function(response) { 
        var code = response.data; 
        var f = new Function(code); 
        f(); 
       }); 
      } 
     } 
    }; 
}); 

<!-- retrieved --> 
<script type="text/javascript-lazy" ng-if="true" src="script.js"></script> 
<!-- not retrieved --> 
<script type="text/javascript-lazy" ng-if="false" src="script.js"></script> 

Это будет работать внутри директивы элемента завернуты, а также.


Plunker - рабочая демо

+0

Проблема для меня заключалась в том, что я объявлял динамически загруженную директиву внутри ''. Ожидая, что он будет работать, как только будет загружен загруженный код. Что я сделал для его решения, так это то, что после директивы 'f()' I '$ compile() и добавьте ее в первую директиву. –

+0

Что мне кажется странным, так это то, что когда я использовал jquery, директива была объявлена ​​статически внутри '', и она все еще работала так, как будто директива каким-то образом оценивалась сама. –

+0

Вы добавляете директивы через jQuery? Если вам да, вам нужно использовать '$ compile' - это нормально, когда вы смешиваете два. Итак, все решено? было немного сложно следовать вашим намерениям с помощью динамических директив, но, надеюсь, теперь все хорошо @naughtyboy – scniro

Смежные вопросы