2016-11-22 79 views
1

这是我的服务。我有变量isPolygonDrawingEnded那里。如何更改服务角度的控制器变量?

angular 
    .module('gillie.clients.app') 
    .service('mapDrawingService', mapDrawingService); 

mapDrawingService.$inject = ['$ngBootbox', '$translate', 'fitPolygonService', 'mapCommonService']; 

function mapDrawingService($ngBootbox, $translate, fitPolygonService, mapCommonService) { 
    var self = this; 

    var map; 
    var polygonFeatures; 
    var stopDrawingAction; 
    var isPolygonDrawingEnded = false; 
    var isDrawingMode = true; 

self.startNewPolygonDrawing = function (afterDrowed) { 

     fitPolygonService.suggestPoint(isDrawingMode); 
     var modify = createModifyInteractionToPolygonFeatures(); 

     var draw = createDrawInteraction(); 
     attachDrawEvents(draw, afterDrowed); 
     map.addInteraction(draw); 

     stopDrawingAction = function() { 
      map.removeInteraction(draw); 
      map.removeInteraction(modify); 
     }; 
    }; 
     var attachDrawEvents = function (draw, afterDrowed) { 
     draw.on('drawend', function (e) { 
      e.preventDefault(); 
      afterDrowed(); 
      isPolygonDrawingEnded = true; 

      if (fitPolygonService.isPolygonsExist()) { 
       var geometry = e.feature.getGeometry(); 
       e.feature.setGeometry(fitPolygonService.fitPolygon(geometry)); 
      } 
     }); 
} 

这是我的控制器。这里我需要在mapDrawingService.isPolygonDrawingEnded == true时更改$scope.showCountButton那么我如何知道服务中的价值已经发生了变化?

angular 
    .module('gillie.clients.app') 
    .controller('regionController', regionController); 

regionController.$inject = ['$q', '$filter', '$scope', '$ngBootbox', '$translate', 'regionService', 'mapService', 'mapDrawingService', 'modalService', 'regionCommonService', 'alertService', 'nominatimCommonService', 'populationService', 'provinceCommonService', 'provinceService', 'rx']; 

function regionController($q, $filter, $scope, $ngBootbox, $translate, regionService, mapService, mapDrawingService, modalService, regionCommonService, alertService, nominatimCommonService, populationService, provinceCommonService, provinceService, rx) { 

    $scope.showCountButton = false; 

     $scope.startRegionSelection = function (region) { 

     $scope.isSavingAvailable = true; 
     $scope.showCountButton = false; 
     if (currentEditingRegion && region && currentEditingRegion.Id === region.Id) { 
      return; 
     } 

     if(region) 
      mapService.clearRegion(region); 

     if (currentEditingRegion && !region) { 
      mapDrawingService.continuePolygonDrawing(); 
      return; 
     } 

     if (region) { 
      mapDrawingService.stopPolygonDrawing(); 
      mapDrawingService.clearMap(); 

      currentEditingRegion = region; 
      mapDrawingService.startExistPolygonDrawing(region.Name, region.CoordinatesJson); 
      return; 
     } 

     mapDrawingService.startNewPolygonDrawing(function() {    
        $scope.showCountButton = true   
     }); 
    }; 

当我使用mapDrawingService.startNewPolygonDrawing功能 - 的showCountButton变化的价值,但鉴于没有。 $scope.$apply产生此异常:

[$rootScope:inprog] $digest already in progress 
+0

看一看[此](http://www.codelord.net/2015/05/04/angularjs-notifying -about-changes-from-services-to-controllers /) –

回答

0

你逝去的回调函数不再在控制器这就是为什么认为没有更新的范围。您可以使用promise,因为您是异步绘制事件。

服务

mapDrawingService.$inject = ['$q', '$ngBootbox', '$translate', 'fitPolygonService', 'mapCommonService']; 

function mapDrawingService($q, $ngBootbox, $translate, fitPolygonService, mapCommonService) { 
    var self = this; 

    var map; 
    var polygonFeatures; 
    var stopDrawingAction; 
    var isPolygonDrawingEnded = false; 
    var isDrawingMode = true; 

    self.startNewPolygonDrawing = function() { 
    fitPolygonService.suggestPoint(isDrawingMode); 
    var modify = createModifyInteractionToPolygonFeatures(); 

    var draw = createDrawInteraction(); 
    var promiseObj = attachDrawEvents(draw); 
    map.addInteraction(draw); 

    stopDrawingAction = function() { 
     map.removeInteraction(draw); 
     map.removeInteraction(modify); 
    }; 

    return promiseObj; 
    }; 
    var attachDrawEvents = function(draw) { 
    return $q(function(resolve, reject) { 
     draw.on('drawend', function(e) { 
     e.preventDefault(); 

     if (fitPolygonService.isPolygonsExist()) { 
      var geometry = e.feature.getGeometry(); 
      e.feature.setGeometry(fitPolygonService.fitPolygon(geometry)); 
     } 

     resolve(); 
     }); 
    }); 
    } 

控制器

mapDrawingService.startNewPolygonDrawing().then(function() { 
    $scope.showCountButton = true 
}); 
+0

angular.js:13550 TypeError:无法读取未定义的属性'then' at Scope。$ scope.startRegionSelection(gillie.clients.region.controller.js:76 )(eval在编译(angular.js:14432),:4:297) at expensiveCheckFn(angular.js:15485) at callback(angular.js:25018) at Scope。$ eval(angular。 js:17229) at Scope。$ apply(angular.js:17329) at HTMLButtonElement。 (angular.js:25023) 在HTMLButtonElement.dispatch(的jquery.js:4737) 在HTMLButtonElement.elemData.handle(的jquery.js:4549) i've这exceptin在浏览器 – waneksx

+0

但真的谢谢你的帮助 – waneksx

+0

对不起,它应该是'return promiseObj;'不''return promiseObj.promise;'。我在上面的例子中修复了它。 – machinehead115