У меня есть директива, которая имеет templateUrl
.В директиве есть переменная $ scope, инициализированная как
$scope.mapLoaded = false;
и метод
$scope.onMapLoaded = function(){
$scope.mapLoaded = true;
$scope.$apply();
};
. В функции $scope.init()
я проверяю это, если карта загруженавызов метода initAutocomplete()
(этот метод инициализирует API адреса Google)
$scope.init = function()
{
console.log('init() is called ' + ' at '+ Date.now());
if($scope.applicationId === undefined || $scope.applicationId == '') return false;
$scope.getAssetLocations($scope.loadAssetLocations);
$scope.getAccountId($scope.loadAccountId);
if($scope.mapLoaded === true){
console.log('[$scope.init] >Map loaded is '+ $scope.mapLoaded + ' at '+ Date.now());
$timeout( function(){
$scope.initAutocomplete();
}, 4000 );
}
};
Я также наблюдаю переменную $scope.mapLoaded
$scope.$watch('mapLoaded', function () {
console.log('[$watch(mapLoaded)] >Map loaded is '+ $scope.mapLoaded + ' at '+ Date.now());
if($scope.mapLoaded === true){
$timeout( function(){
$scope.initAutocomplete();
}, 4000 );
}
});
И в части просмотра:Я проверяю через jQuery, что, если документ готов, загрузите карту Google.
<html>
..some html here
</html>
<script>
$(document).ready(function () {
console.log('loadGoogleMap is called from ApplicationAsset at '+ Date.now() + ' after the document is ready');
window.setTimeout(loadGoogleMap, 1000);
});
function loadGoogleMap(){
if (window.google && document.getElementById('AppAssetLocation')) {
angular.element(document.getElementById('AppAssetLocation')).scope().onMapLoaded();
console.log('loadGoogleMap called from ApplicationAsset at '+ Date.now());
}
else {
window.setTimeout(loadGoogleMap, 1000);
console.log('Again, loadGoogleMap is trying to call from ApplicationAsset at '+ Date.now());
}
}
</script>
Но, что здесь происходит, иногда он вызывает window.setTimeout(loadGoogleMap, 1000);
внутри $(document).ready
, а иногда не вызывает,И это совершенно случайно.
В чем проблема, ребята?