Angular загрузочная загрузка после загрузки html

Сначала я инициализирую свое приложение с помощью ng-app = "myApp" в теге body, и это отлично работает для всех angularized-html, загружаемых при загрузке первой страницы.

Позже у меня есть код, который загружает angularized-html в DOM.

В angular 1.08 я мог просто запустить angular.bootstrap($ newLoadHTML, [ "myApp" ]) после загрузки, и он будет работать; где $newLoadHTML - это недавно добавленный HTML, захваченный jQuery.

В angular 1.2 это больше не работает: (

Ошибка: [ng: btstrpd] Приложение уже загружено с помощью этого элемента http://errors.angularjs.org/1.2.0-rc.2/ng/btstrpd?p0=%3Cdiv%20ng-controller%3D%22AfterCtrl%22%3E

Я получаю эту ошибку, которую я понимаю, но я не знаю, как ее решить.

Что мне нужно сделать, это загрузить angularized-html, а затем сообщить angular об этом.

Здесь показан плункер: http://plnkr.co/edit/AHMkqEO4T6LxJvjuiMeT?p=preview

Ответ 1

Динамически загружает контроллер AngularJS

Ответ на этот вопрос поставил мою проблему. Поскольку мне нужно создать контроллеры после добавления содержимого в DOM. Это исправление требует, чтобы я тоже регистрировал контроллеры после того, как я это объявил. Если у кого-то есть более легкое решение, попробуйте вставить.

Ответ 2

Я повторю то, что говорили другие: такая вещь вообще плохая идея, но я также понимаю, что вам иногда приходится работать с устаревшим кодом так, как вы бы этого не хотели. Все, что вы сказали, вы можете превратить HTML, загруженный извне Angular в Angular -граничные виды с помощью службы $compile. Здесь, как вы можете переписать свой текущий пример, чтобы он работал с $compile:

// We have to set up controllers ahead of time.
myApp.controller('AfterCtrl', function($scope)  {
  $scope.loaded = 'Is now loaded';
});

//loads html and afterwards creates a controller
$('button').on('click', function() {
  $.get('ajax.html', function(data) {

    // Get the $compile service from the app injector
    var injector = $('[ng-app]').injector();
    var $compile = injector.get('$compile');

    // Compile the HTML into a linking function...
    var linkFn = $compile(data);
    // ...and link it to the scope we're interested in.
    // Here we'll use the $rootScope.
    var $rootScope = injector.get('$rootScope');
    var elem = linkFn($rootScope);
    $('.content').append(elem);

    // Now that the content has been compiled, linked,
    // and added to the DOM, we must trigger a digest cycle
    // on the scope we used in order to update bindings.
    $rootScope.$digest();

  }, 'html');
});

Вот пример: http://plnkr.co/edit/mfuyRJFfA2CjIQBW4ikB?p=preview

Это упрощает некоторые вещи, если вы можете создать свою функциональность в качестве директивы вместо использования raw jQuery - вы можете вставлять в нее службы $compile и $rootScope или даже использовать локальную область внутри директивы. Еще лучше, если вы можете использовать динамическое связывание в элементе <ng-include>.

Ответ 3

Ваш подход кажется неправильным. Вы используете jQuery и Angular вместе неподходящим способом, который может иметь конфликты.

Angular встроенная поддержка шаблонов - лучший способ сделать это либо с помощью ng-include, либо вы можете использовать маршрутизацию Angular и вместе с ng-view. Документация находится здесь:

http://docs.angularjs.org/api/ng.directive:ngInclude

http://docs.angularjs.org/api/ngRoute.directive:ngView

Простейшим возможным было бы просто установить ng-include в строку url:

<div ng-include="'ajax.html'"></div>

Если вам действительно нужно загрузить динамически, когда вы что-то делаете, это более полное решение для вас:

http://plnkr.co/edit/a9DVEQArS4yzirEQAK8c?p=preview

HTML:

<div ng-controller="InitCtrl">
    <p>{{ started }}</p> 
    <button ng-click="loadTemplate()">Load</button>
    <div class="content" ng-include="template"></div>
</div>

JavaScript:

var myApp = angular.module('myApp', [])
.controller('InitCtrl', function($scope) 
{
    $scope.started = 'App is started';
    $scope.loadTemplate = function() {
      console.log('loading');
      $scope.template = "ajax.html";
    }
}).controller('AfterCtrl', function($scope) 
{
    $scope.loaded = 'Is now loaded';
});

Ответ 4

Еще одна ошибка, которая приводит к этой ошибке Bootstrapping, - это сценарии nginclude или ngview, в которых ваш динамический html включает script ссылки на angular js.

Мой html ниже вызывал эту проблему, когда он был введен в существующую страницу angular. Ссылка на angular.min.js вызвала перезагрузку angular:

<div id="fuelux-wizard" class="row-fluid" data-target="#step-container">
    <ul class="wizard-steps">
       <li data-target="#step1">
            <span class="step">1</span>
            <span class="title">Submit</span>
        </li>    
        <li data-target="#step2">
            <span class="step">2</span>
            <span class="title">Approve</span>
        </li>    
        <li data-target="#step3">
            <span class="step">3</span>
            <span class="title">Complete</span>
        </li>
    </ul>
</div>

<script src="/Scripts/Angular/angular.min.js"></script>
<script type="text/javascript">    
    angular.element('#requestMaster').scope().styleDisplayURL();
</script>