AngularJS ng-include inside of Google Maps InfoWindow?

后端 未结 3 1893
囚心锁ツ
囚心锁ツ 2020-12-02 21:50

I\'m trying to include a template file views/infowindow.html as the content of my InfoWindow from service I wrote to initiate the google maps api:



        
相关标签:
3条回答
  • 2020-12-02 22:04

    Have you tried the compile function? http://docs.angularjs.org/api/ng.$compile

    I did not look into angular a lot yet, but I think this could work.

    alternatively you could try bootstrapping the stuff. but I dont believe it is the correct way... http://docs.angularjs.org/guide/bootstrap

    0 讨论(0)
  • 2020-12-02 22:12

    The above answers are solid, but you lose your binding on:

    infowindow.setContent( compiled[0].innerHTML );
    

    Do this instead:

    infowindow.setContent( compiled[0] );
    

    Otherwise if you have something like <div>{{myVar}}</div>, it won't update if myVar is updated in your app.

    0 讨论(0)
  • 2020-12-02 22:14

    After you add the content to the DOM, you'll need to find it (maybe with a jQquery selector?), then $compile() it and apply it to the appropriate scope. This will cause Angular to parse your content and act on any directives it finds (like ng-include).

    E.g., $compile(foundElement)(scope)

    Without more code, it is difficult to give a more precise answer. However, here is a similar question and answer you can look at.

    Update: okay, I finally got this to work, and I learned a few things.

    google.maps.event.addListener(
          marker,
          'click',
          (function( marker , scope, localLatLng ){
            return function(){
              var content = '<div id="infowindow_content" ng-include src="\'infowindow.html\'"></div>';
              scope.latLng = localLatLng;
              var compiled = $compile(content)(scope);
              scope.$apply();
              infowindow.setContent( compiled[0].innerHTML );
              infowindow.open( Map , marker );
            };//return fn()
          })( marker , scope, scope.markers[i].locations )
    

    I was under the impression that only DOM elements could be $compiled -- i.e., that I first had to add the content to the DOM, and then compile it. It turns out that is not true. Above, I first compile content against the scope, and then add it to the DOM. (I don't know if this might break databinding -- i.e., the $watch()es that were set up by $compile.) I had to set scope.latLng because the ng-included template needs to interpolate {{latLng[0]}} and {{latLng[1]}}. I used innerHTML instead of outerHTML so that only the contents of infowindow.html are inserted.

    Plunker.

    Update2: Clicking does not work the first time. It appears that 'infowindow.html' is not loaded until a second click (I tried calling scope.$apply() a second time... didn't help). When I had the plunker working, I had inlined the contents of infowindow.html in index.html:

    <script type="text/ng-template" id="/test.html">
      <h4>{{latLng[0]}},{{latLng[1]}}</h4>
    </script>
    

    I was using that in addListener():

    var content = '<div id="infowindow_content" ng-include src="\'/test.html\'"></div>';
    

    I changed the plunker to use the inlined template.

    0 讨论(0)
提交回复
热议问题