Я использую RequireJS загрузить JS, но HTML частичное не будет ждать необходимых директив JS ....Ленивая загрузка: Нужна JS Перед HTML визуализации
- Начать загрузку JS
- Рендер HTML (ж/директив)
- Finish JS затем определяют директивы (к сожалению слишком поздно, уже оказанные HTML)
я позволяю «плагинов» в моем SPA, которые позволяют мне отказаться от новых лиц (HTML + JS). HTML загружается через контроллер (в этом случае «$ templateFactory.fromUrl()» внутри ссылки директивы), а соответствующий JS включен из частичного частичного HTML.
function inputFrequencyDirective($templateFactory, $compile) {
return {
restrict: 'E',
scope: {},
bindToController: {
frequency: '=ngmodelFrequency',
},
compile: function CompilingFunction(element, attrs) {
return function LinkingFunction($scope, $element, $attrs) {
var frequency = $scope.vm.frequency;
var type = frequency.type;
var promise = $templateFactory.fromUrl(type + ".html");
promise.then(function (template) {
var e = $compile(template)($scope);
$element.replaceWith(e);
});
};
},
HTML, частичная (Weekly.html):
<script type="text/javascript">
// Async load "weekly.js"
require(['angular', 'weekly'], function (angular) {
console.log("weekly.html require complete");
});
</script>
<h1>Weekly</h1>
<div>
<frequency-type-selector ngmodel-type="vm.frequency.type"></frequency-type-selector>
<div><label>Every <frequency-weekly-input-day ngmodel-day="vm.frequency.day"></frequency-weekly-input-day> (day of week)</label></div>
</div>
JS включен (weekly.js):
function (angular) {
var app = angular.module('myApp');
app.lazy.directiveRegister('frequencyWeeklyInputDay', [function() {
[...]
Решение простое и отлично работает со стандартными рамками , но используя async RequireJS, у меня есть проблема секвенирования. Если я переключу свой тип частоты на «ежедневно», а затем вернусь к «еженедельному», HTML будет корректно отображаться, потому что директива еженедельно зарегистрирована в файле weekly.js DID, но слишком поздно для первого рендеринга Weekly.html.
Я по существу хочу «дождаться завершения», прежде чем скрипт завершится (таким образом, задержка визуализации HTML). Лучший способ может заключаться в том, чтобы окружить HTML элементом utlizing «ng-if» и включить HTML, «пропустив ng-if» из сценария Weekly.html «require». Это должно заставить элемент отображаться должным образом, когда загрузка будет завершена.
Хотелось бы узнать, разумна ли идея «ng-if» и как это сделать изнутри блока неагрессивного скрипта. Я не знаю, как получить ссылку на предлагаемый элемент с помощью ng-if или как сделать это безопасно из других экземпляров этого потенциально общего элемента управления.
Предлагаемая "понятие":
<script type="text/javascript">
var someflag = false;
require(['angular', 'weekly'], function (angular) {
someflag = true;
});
</script>
<h1>Weekly</h1>
<div ng-if="someflag">
<frequency-type-selector ngmodel-type="vm.frequency.type"></frequency-type-selector>
<div><label>Every <frequency-weekly-input-day ngmodel-day="vm.frequency.day"></frequency-weekly-input-day> (day of week)</label></div>
</div>
Я использую текущие версии: угловые 1.4.8, 0.2.17 uiRouter, requireJS 2.2.0
взгляните на это репо, он работает намного проще. https: // github.com/ocombe/ocLazyLoad –
Вот полный Plunk https://plnkr.co/edit/76feCbf15aJhYeJkS8VZ – AAron
Удаленный комментарий имел хороший цикл опроса. Я пытаюсь обратить внимание на то, что у меня есть файл с HTML и JS ... и мне нужно отложить сам HTML. Приятно использовать таймауты/события, но мне действительно нужно блокировать, пока функция RequireJS не установит флаг. Мне бы очень хотелось использовать события здесь и включить этот HTML-блок (ng-if), но я не знаю, как его достичь со стандартного Javascript. (Тем временем я смотрю на этот ocLazyLoad, чтобы увидеть, будет ли он предлагать сопоставимые простое решение) – AAron