0

在我的應用程序我有一個「地圖」顯示和處理地圖上的東西。 A CtrlMap控制器顯示地圖並顯示標記。 watchPosMap監視位置變化。 3rd有一個名爲markerService的服務,它包含標記的屬性(位置)。更新控制器在服務不更新視圖

結構看起來像那樣。

[CtrlMap] <-> [MarkerService] <- [watchPosMap]

這是服務:

MyMapApp.service('MarkerService', function() { 
    //set initial marker if no one exists 
    if (property == undefined) 
    { 
     var property = { 
      latitude: 44.49, 
      longitude: -108.42}; 
    } 
    return { 
     getP: function() { 
      return property; 
     }, 
     setP: function(lat,lng) { 
      consolie.info('Have new marker properties:', lat,lng); 
      property = { 
       latitude: lat, 
       longitude: lng}; 
     } 
    }; 
}); 

在啓動時,CtrlMap控制器獲取以這種方式默認標記設置:$scope.marker = MarkerService.getP()。這很好。

如果設備的位置發生變化,watchPosMap包含一個帶回調的navigator.geolocation.watchPosition方法,該方法調用服務MarkerService以設置新的標記參數。

這是我watchPosMap控制器:

MyMapApp.controller('watchPosMap', ['$scope', 'MarkerService', function($scope) {    
$scope.watchMyPositionChangesID = 
      navigator.geolocation 
        .watchPosition(function(data) { 
         mapScope=angular.element(document.getElementById('id_map')) 
           .scope(); 
         angular.element(document.getElementById('id_map')) 
           .injector().get("MarkerService") 
           .setP(data.coords.latitude,data.coords.longitude); 
         mapScope.$apply(); 
         }, 
         function(e){$scope.errorMsg=e;}, 
         { timeout: 30000 } 
        ); 

}]); 

設置標誌屬性的作品,但視圖不更新。有什麼todo來觸發視圖更新?

回答

0

如果您在適當的範圍內,那麼您必須更新範圍,因爲您正在修改角度以外的東西。評論後

angular.element(document.getElementById('id_map')).scope().$apply(); 

編輯:

你的範圍標記不更新事件,雖然它是在服務設置。更清潔的方式 $適用的範圍有哪些,你可以用它來達到同樣的

navigator.geolocation 
       .watchPosition(function(data) { 
        mapscope = angular.element(document.getElementById('id_map')).scope() 
        mapscope.$apply(function(scope){ 
         MarkerService.setP(data.coords.latitude,data.coords.longitude); 
         scope.marker = MarkerService.getP(); 
        }); 
        }, 
        function(e){$scope.errorMsg=e;}, 
        { timeout: 30000 } 
       ); 
+0

我還是用一個回調函數:您使用$應用()

mapScope.marker = angular.element(document.getElementById('id_map')) .injector().get("MarkerService") .getP(); 

EDIT 2之前,它已經到更新$適用於()。我編輯我的問題:請看看'watchPosMap'控制器。 –

+0

服務屬性已更新,但恐怕標記未更新。您需要更新mapScope.marker = angular.element(document.getElementById('id_map')) .injector()。get(「MarkerService」) .getP();在使用$ apply() – Sai

+0

耶!而已! :-)我想知道,如果我的解決方案是結合angularjs和傳統JS的正確方法? –

相關問題