2016-11-22 69 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

相關問題