If you are in appropriate scope, then you have to update scope as you are modifying things outside angular.
angular.element(document.getElementById('id_map')).scope().$apply();
EDIT after comment:
Your scope marker is not updated event though it is set in service. It has to updated before you use $apply()
mapScope.marker = angular.element(document.getElementById('id_map'))
.injector().get("MarkerService")
.getP();
EDIT 2: More Cleaner way $apply of scope has a callback function which you can use to achieve the same
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 }
);