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
Post a Comment