Область действия директивы контроллера Angular

Последние пару часов я боролся со следующей проблемой, и я понятия не имею, как ее решить. Я делаю угловое приложение, которое использует директиву angular-openlayers-directive. Объект $scope.center содержит положение, которое изначально просматривается на карте. Следующий фрагмент кода — это первые строки контроллера страницы, которая просматривает карту. Все это хорошо работает.

angular.extend($scope, {
    center: {
        lat: 0,
        lon: 0,
        zoom: 1,
        autodiscover: true
    },
    layers: {
        normal: {
            type: 'Tile',
            source: {
                type: 'OSM'
            }
        }
    }
});

Однако теперь я пытаюсь обновить центральный объект с помощью местоположения, полученного из API геокодирования Google. Щелчок по строке результатов API Google вызывает следующую функцию в контроллере:

$scope.gotoLocation = function(lat, lon) {
    $log.log("called");
    $scope.center = {
        lat: 50,
        lon: 50,
        zoom: 0
    }
}

В моей консоли появляется строковый журнал "вызванный", но вид карты не меняется. Также, когда я печатаю $scope.center в функции, печатается исходный объект, установленный выше, в то время как этот объект изменился на мои текущие широту и долготу, потому что для параметра автообнаружения установлено значение true. Я проверил это с помощью следующего кода:

<openlayers ol-controls="controls" ol-center="center" ol-layers="layers" ol-markers="markers">
    <ol-marker ng-repeat="marker in markers" lat="marker.lat" lon="marker.lon"></ol-marker>
</openlayers>

<form>
    Latitude : <input type="number" step="any" ng-model="center.lat" />
    Longitude : <input type="number" step="any" ng-model="center.lon" />
    Zoom : <input type="number" step="any" ng-model="center.zoom" />
</form>

Все 3 поля показывают мою текущую широту и долготу, а также, когда я меняю поле, положение на карте обновляется (!). Я понятия не имею, почему изменение модели из самого шаблона работает, а изменение ее из контроллера не работает. Кто-нибудь может мне с этим помочь?

Ссылка на директиву: https://github.com/tombatossals/angular-openlayers-directive/blob/master/dist/angular-openlayers-directive.js


person user2817219    schedule 29.12.2014    source источник
comment
Что ж, можешь попробовать воспроизвести проблему в плункере? Вот пустой шаблон для angular, с которого можно начать: plnkr.co/edit/WprgipAdFBtxDKM6jogo?p= предварительный просмотр   -  person SoluableNonagon    schedule 30.12.2014


Ответы (2)


Кажется, ваша переменная автообнаружения стерта. Это связано с автообновлением?

Попробуйте изменить функцию gotoLocation, чтобы обновить свойства, а не перезаписывать объект:

$scope.gotoLocation = function(lat, lon) {
    $log.log("called");

    $scope.center.lat = 50;
    $scope.center.lon = 50;
    $scope.center.zoom = 0;

}
person SoluableNonagon    schedule 29.12.2014
comment
Первоначально установка для автообнаружения значения true приводит к директивному поиску текущих широты и долготы пользователя, заменяет текущие долготу и широту центрального объекта, а затем устанавливает для автообнаружения значение false. В конце концов, центральный объект будет выглядеть так после загрузки контроллера: center: {широта: ‹currentlat›, lon: ‹currentlon›, zoom: 1, autodiscover: false }, Функция $scope.gotoLocation остается в исходном состоянии. Я узнал, что автообнаружение меняется на false, войдя в директиву. - person user2817219; 30.12.2014
comment
Вы можете воспроизвести проблему в плункере? - person SoluableNonagon; 30.12.2014

Это было связано с разными масштабами. Мой вид карты был включен с помощью ng-view. Моя панель поиска была включена с помощью ng-include, поэтому у них были разные области видимости. Я решил это с помощью factory.

person user2817219    schedule 03.01.2015