Ошибка: [$ compile: multidir] Несколько директив [ngSwitchWhen, ngInclude], запрашивающих включение - PullRequest
0 голосов
/ 23 апреля 2020

Мне нужно решение для предварительной загрузки данных с помощью 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;
        });
});

Большая часть кода равна к примеру по ссылке выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...