Внедрить службу определения местоположения AngularJS 1.2 $ в контроллер, не работающий в PhoneGap 3.0

Почему в эмуляторе Windows Phone 7.1 с PhoneGap 3.0 и AngularJS 1.2 это не работает:

angulargap.controller('HomeController', ['$scope', '$routeParams', '$location',
function ($scope, $routeParams, $location) {
    $scope.$routeParams = $routeParams;
    $scope.$location = $location;
    $scope.message = "AngularJS!";
}]);

Сообщение об ошибке:

ERROR:Error: [$injector:cdep] Circular dependency found: 
http://errors.angularjs.org/1.2.0-rc.2/$injector/cdep?p0=

Пока это работает:

angulargap.controller('HomeController', ['$scope', '$routeParams',
function ($scope, $routeParams) {
    $scope.$routeParams = $routeParams;
    $scope.message = "AngularJS!";
}]);

Что не так с внедрением службы $ location в этом конкретном сценарии? Все отлично работает в Chrome и Internet Explorer в настольном браузере. Но он не работает ни в эмуляторе устройства Windows Phone 7, ни на самом физическом устройстве.


person kroonwijk    schedule 13.10.2013    source источник
comment
Интересно, связано ли это с вашей инъекцией $ location в $ scope. Не могли бы вы попробовать удалить $scope.$location = $location и посмотреть, сохраняется ли проблема? Так что мы можем изолировать проблему.   -  person KayakDave    schedule 14.10.2013
comment
Привет, @KayakDave, проблема такая же после удаления этой строки. Этот конкретный фрагмент кода взят из примера, который отлично работает в браузере.   -  person kroonwijk    schedule 14.10.2013
comment
Интересная проблема. Если вы еще не видели, вот подробности о вашей ошибке: docs.angularjs.org/error / $ injector: cdep Следующее, что я хотел бы попробовать, - это поместить все это в модуль, чтобы более жестко контролировать область видимости. Но это только предположение.   -  person KayakDave    schedule 14.10.2013
comment
Я вижу, вы используете модуль - ой. Но у меня есть другая идея - как насчет переименования вашего параметра функции $ location во что-то другое. Оставьте первое "$ location" после квадратных скобок как есть. Но измените второй на что-то вроде переименованного $ location и используйте переименованную версию в своем коде. Это должно поддерживать работу минификации, но может адресовать инжектору, пытающемуся ввести $ location дважды. Но это всего лишь теория.   -  person KayakDave    schedule 14.10.2013


Ответы (1)


Понятно, ребята ... Существует значительное количество проблем с комбинацией AngularJS / PhoneGap / WindowsPhone. Эта проблема была решена с помощью https://github.com/angular/angular.js/issues/2303?source=cc#issuecomment-20770025.

По сути, поскольку Windows Phone использует странный префикс протокола с одной косой чертой (x-wmapp0:/), инициализатор $ location сходит с ума, и это вызывает ошибку, которая явно проявляется в этом странном сообщении об ошибке, совершенно не связанном с ошибкой :-(

Я собираюсь предложить запрос на перенос этого исправления в репозиторий AngularJS на GitHub.

person kroonwijk    schedule 14.10.2013