Take the 2-minute tour ×
Stack Overflow is a question and answer site for professional and enthusiast programmers. It's 100% free, no registration required.

For this scenario, I have a page of HTML with some AngularJS directives, controllers, etc.

Something like this:

<html>
<body>
  <div ng-controller="myCtrl">
     <ul><li ng-repeat="item in items">{{item.name}}</li></ul>
  </div>
  <div class="placeholder">
     ...new HTML here...
  </div>
</body>
</html>

Notice that there is no ng-app directive on the page. I am not relying on auto-bootstrapping, but rather I am using the manual bootstrapping method.

angular.bootstrap(document, ['myApp']);

First, I create the module which will be bootstrapped to the document. Then as a dynamically determined list of dependencies are loaded, I attach some services, controllers, etc. Once everything is ready I call the bootstrap method.

This all works fine, until JavaScript outside of AngularJS appends to the DOM at the ...new HTML here... location. The new HTML is not processed by AngularJS.

My understanding is that you need to call $scope.$apply() or $digest() or something to get AngularJS to recognize the new HTML. However, in my example there is no controller around the new HTML coming in. The incoming HTML may look like this:

  <div ng-controller="myOtherCtrl">
     <h2>{{model.title}}</h2>
  </div>

In other words, it is relying on a different controller in the app module.

  • I can't call the angular.bootstrap method again, because the page is already bound.
  • I can't call $scope.$apply from inside the controller because the whole point is that controller code isn't being called.
  • I don't see a way to get a reference to the controller in order to re-apply or refresh it.

I have read the Ifeanyi Isitor lazy loading post and the Ben Nadel post, yet they don't seem to address HTML loaded outside the context of an existing controller.

It isn't an option for me to use AngularJS directives to handle the DOM manipulation. It is a separate part of the architecture which uses ExtJS as the framework for injecting the new DOM elements. This means I can't use ngInclude for example.

It would seem like I could just call angular.module('myApp').$refresh(); or .$apply() but that isn't an option. What am I missing?

share|improve this question
    
I don't have any experience using extJS and angular together, so I'm afraid I cant help you any further. Just one thing to keep in mind though, AngularJS and ExtJS are both frameworks that are designed to be the only framework a webapp needs. Using two frameworks means that every client has to download a lot more data, which is often problematic, especially on mobile devices. See if you can convert the ExtJS part of your app to angularjs or vice versa. –  bigblind Dec 18 '13 at 7:59
    
ExtJS only comes into play during the Authoring experience and I don't have the option to remove it. I would like to use Angular for its modularity, 2-way binding, testability, etc. All ExtJS does in this case is render some HTML into a spot in the DOM. Being able get Angular to recognize that the change happened seems to be the challenge. –  jedatu Dec 18 '13 at 8:54

3 Answers 3

You might want to use $compile service. That's what angular do at first place.

And also this guide: http://docs.angularjs.org/guide/compiler

share|improve this answer

I had the same problem. This worked for me: https://docs.angularjs.org/api/ng/function/angular.injector

share|improve this answer

I think ng-include might help you, it loads a partial page into the element and compiles and processes it like any other part of your web page.

If This element is the main view of your web app, and you want to load different 'screens' into it, depending on the url, ng-view may come in handy.

share|improve this answer
    
Thanks, I updated the question to clarify what is injecting the DOM elements. I don't think I can rely on ng-include because it needs the src URL which it loads and injects. ng-view might be worth digging into. My only concern there is that I don't really know where the HTML will be injected into the DOM so unless I can put the ng-view directive on the body tag, I don't think it will work. –  jedatu Dec 18 '13 at 7:38

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.