Мне нужно решение для предварительной загрузки данных с помощью ng-include, как в этом сообщении в блоге. preloading-data-before-executing-nginclude-in- angularjs описано.
Кажется, что это решение работает хорошо, но автор работает с angular версия 1.0.7. Я использую версию 1.2.1, а также пробовал версию 1.7.9, и в результате появляется сообщение об ошибке.
Error: [$compile:multidir] Multiple directives [ngSwitchWhen, ngInclude] asking for transclusion on: <div ng-switch-when="one" bn-preload="oneData" bn-include-log="" ng-include=" 'one.htm' ">
Как я могу исправить это с более новой версией или есть лучшее решение?
В моем проекте я получаю данные по запросу, и ng-include должен ждать до запрос заканчивается, и данные для отображения доступны.
Редактировать:
Мой HTML код выглядит так
<div ng-init="validityList = validities.UploadList;" bn-preload="validities" ng-include="'/validity/list'"></div>
И ошибка в моем проекте
Multiple directives [ngInclude, bnPreload] asking for transclusion on
Решение, предложенное Лемми, не работает для меня, потому что bn-preload и ng-include должны быть на одном элементе.
Edit2:
Дон не знаю, что вы подразумеваете под "bn-preload html".
Это то, что я сделал до сих пор в angular.
const BaseApp = angular.module('BaseApp')
.factory('preloader', function ($q, $interval) {
this.load = function (target) {
const deferred = $q.defer();
const loadData = $interval(function () {
if ($q[target].length > 0) {
deferred.resolve($q[target]);
$interval.cancel(loadData);
}
}, 100);
return (deferred.promise);
}
})
.directive('bnPreload', function (preloader) {
function compile(templateElement, templateAttribute, transclude) {
function link($scope, element, attributes) {
let injectedElement = null;
let isDestroyed = false;
preloader.load(attributes.bnPreload).then(
function (preloadedData) {
if (isDestroyed) {
return;
}
$scope.setData(preloadedData);
transclude($scope, function (copy) {
element.after(injectedElement = copy);
});
}
);
$scope.$on(
'$destroy',
function () {
isDestroyed = true;
$(injectedElement).remove();
}
);
}
return (link);
}
return ({
compile: compile,
priority: 250,
terminal: true,
transclude: 'element'
});
})
.controller('validity', function ($scope, $http) {
$http({
method: 'POST',
url: '/validity/getall'
})
.then(function (response) {
$scope.validities = response.data;
});
});
Большая часть кода равна к примеру по ссылке выше.