2016-11-22 12 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を見てくださいサービスからコントローラへの変更について) –

答えて

0

あなたはそれがビューが更新されていない理由は、コントローラの範囲でなくなったコールバック関数を渡しています。非同期描画イベントであるため、代わりに約束を使用することができます。

サービス

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'を読み取れません。$ scope.startRegionSelection(gillie.clients.region.controller.js:76 )ファンクションコールバック(angle.js:25018) スコープ。$ eval(angular)。fnでのコンパイル(eval at compile(angular.js:14432)、:4:297) at expensiveCheckFn(angular.js:15485) js:17229) (スコープ)$ apply(angular.js:17329) at HTMLButtonElement (angular.js:25023)HTMLButtonElement.dispatchで (jquery.js:4737)HTMLButtonElement.elemData.handle(jquery.js:4549)で ブラウザ – waneksx

+0

でこのexceptin i've が、本当に助けてくれてありがとう – waneksx

+0

申し訳ありませんが、「return promiseObj; promiseObj.promise;」ではなく、「return promiseObj;」でなければなりません。私は上記の例でそれを修正しました。 – machinehead115

関連する問題