javascript - Angularjs: Services and ui.router -


i use angular service rendering map , injected controller. using ui.router, when go map page first time, map renders successfully, when routing other page , come map page again, map not renders, , should refresh page it. used both factory , service it, still there problem! idea? here service , controller:

      angular.module('app')     .service('mapservice', function () {         var _map = new ol.map({             target: 'map-canvas',             renderer: 'canvas'         });         this.map = function () {             return _map;         };     }     .controller("mapctrl", ["$scope", "mapservice", function($scope, mapservice) {         var map = mapservice.map();     }]);  

you should not use service dom related changes , initialising map dom related action. instead, use directive this.

see below example, have used open layer map , ui.router show how can same directive.

var app = angular.module('app', ['ui.router']);    app.run(function($templatecache) {    var homehtml = '<div>' +      '<h4>rome page</h4>' +      '<p> rome </p>' +      '<div> <ol-map center="rome"></ol-map> </div>' +      '</div>';    $templatecache.put('rome.html', homehtml);      var otherhtml = '<div>' +      '<h4>bern page</h4>' +      '<p> bern</p>' +      '<div> <ol-map center="bern"></ol-map> </div>' +      '</div>';    $templatecache.put('bern.html', otherhtml);  });    app.config(function($stateprovider, $urlrouterprovider) {      $urlrouterprovider.otherwise("/rome");      $stateprovider.state('rome', {      url: "/rome",      templateurl: "rome.html",      controller: function($scope) {        $scope.rome = ol.proj.fromlonlat([12.5, 41.9]);      }    }).state('bern', {      url: "/bern",      templateurl: "bern.html",      controller: function($scope) {        $scope.bern = ol.proj.fromlonlat([7.4458, 46.95]);      }    });  });    app.controller('ctrl', function($scope) {    });    app.directive('olmap', function() {      return {      restrict: 'e',      scope: {        center: '='      },      link: function(scope, ele, attr) {          scope.map = new ol.map({          view: new ol.view({            center: scope.center,            zoom: 6          }),          layers: [            new ol.layer.tile({              source: new ol.source.mapquest({                layer: 'osm'              })            })          ],          target: ele[0]        });      }    };  });
ol-map {    width: 500px;    height: 300px;    display: block;  }  ul {    padding: 0px;  }  ul li {    padding: 0;    margin: 0;    list-style: none;    display: inline-block;  }
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>  <link href="https://cdnjs.cloudflare.com/ajax/libs/ol3/3.5.0/ol.css" rel="stylesheet" />  <script src="https://cdnjs.cloudflare.com/ajax/libs/ol3/3.5.0/ol.js"></script>  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular-ui-router/0.2.15/angular-ui-router.min.js"></script>    <div ng-app="app">    <ul>      <li><a ui-sref="rome">rome</a>      </li>      <li><a ui-sref="bern">bern</a>      </li>    </ul>    <div ui-view></div>  </div>

update

to map instance directive, callback can used directive map instance value once map initialised. working code can seen here jsfiddle.


Comments

Popular posts from this blog

angularjs - ADAL JS Angular- WebAPI add a new role claim to the token -

php - CakePHP HttpSockets send array of paramms -

node.js - Using Node without global install -