WedX - журнал о программировании и компьютерных науках

Ручная загрузка шаблона с контроллером в AngularJS

В AngularJS я пытаюсь вручную загрузить шаблон, который использует предопределенный контроллер.

Я вызываю WebApi, чтобы получить список доступных шаблонов. Когда этот список получен, я должен загрузить каждый шаблон на страницу. В каждом шаблоне также используется контроллер AngularJS, поэтому соединение между шаблоном и предварительно загруженным контроллером должно работать.

После некоторого поиска в Google я остановился на этом предыдущем (и несколько старом) вопросе: AngularJS Manually Render Controller и шаблон

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

Как я могу заставить ExampleTemplateToLoad.html загружаться кодом, вставленным в div#LoadedTemplates, при этом функционируя как обычный шаблон с использованием контроллера?

main.js

var myApp = angular.module('myApp', [.....]);
myApp.config(function($routeProvider) {
    $routeProvider.when('/', { templateUrl : '/mainTemplate.html' });
});

myApp.controller('mainController', function ($scope, $http) {
    $http.get('/api/getListOfTemplateScripts').success(function (data) {
        // This returns a list of scripts that should be loaded
        // Scripts are loaded using https://github.com/ded/script.js
        // These scripts show up in "Sources" in Chrome Developer Tools,
        // and any syntax errors in these scripts are also displayed in
        // the console, so the script is definitely loaded
        angular.forEach(data, function (scriptFile, key) {
            $script(scriptFile, function() {
                console.log(scriptFile + " loaded");
            });
        });
    })
    .then(function() {
        $http.get('/api/getListOfTemplate').success(function (data) {
            // This returns a list that includes ExampleTemplateToLoad.html
            // The template should then be loaded into div#LoadedTemplates
            angular.forEach(data, function (templateFile, key) {
                // This is logged *after* "scriptToLoad loaded" in the console
                console.log('Loading template ' + templateFile);
            });
        });
    });
});

mainTemplate.html

<div ng-controller="mainController">
    <div id="LoadedTemplates"></div>
</div>

ПримерTemplateToLoad.html

<div ng-controller="loadedTemplateController">
    <!-- Do whatever the template needs to do, using variables defined
         in $scope as it would normally do -->
</div>

ПримерTemplateControllerToLoad.js

myApp.controller('loadedTemplateController', function ($scope, $http) {
});

Ответы:


1

Не уверен, что вы должны изменять DOM из контроллера, но я бы попробовал привязать ваши «LoadedTemplates» к переменной (используя ng-модель) и в контроллере, как только вы получите динамический шаблон обратно из $http.get, получить ссылку на div, т.е.

var target = $document[0].getElementById('LoadedTemplates')

а затем сделать что-то вроде:

element.append(htmlReturnedByService);
$compile( element.contents() )( $scope );

Не проверял, но может поможет :D

25.05.2016
  • Первая ошибка в консоли scope is not defined. Если я попытаюсь заменить scope на $scope, я получу Argument 'loadedTemplateController' is not a function, got undefined. Это связано с ленивой загрузкой файла сценария шаблона. Если я поставлю контроллер в main.js, он работает. Я обновляю приведенный выше код, чтобы также показать ленивую загрузку скриптов. 25.05.2016
  • Хотя ваш браузер может загружать скрипт, контроллер должен быть зарегистрирован в вашем приложении angular. Попробуйте использовать $controllerProvider.register вместо $script? 25.05.2016
  • Как использовать $controllerProvider.register, если у меня есть только ссылка на JS-файл? 25.05.2016
  • Не обращайте внимания на последний комментарий. Если я в myApp.config сохраню ссылку на $controllerProvider.register, я смогу использовать эту ссылку в моем лениво загруженном JS-файле вместо myApp.controller, и теперь это работает. Теперь, чтобы заставить это работать в директиве, поскольку вы правы, говоря, что DOM не следует изменять из контроллера. 25.05.2016
  • @GTHvidsten хорошо, рад, что немного помог :) 25.05.2016
  • Ваш бит определенно указал мне правильное направление, и теперь у меня есть рабочая директива, которая делает именно то, что я хотел. Я посмотрю, смогу ли я получить рабочий JSFiddle и свяжу его позже. Спасибо :) 25.05.2016
  • Вот пример рабочего планкера: plnkr.co/edit/3kMPuSHmDuahhSFA0Nuq?p=preview 25.05.2016
  • Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]