Гибридные приложения для нескольких устройств с angularjs на Android: $location.path() не работает

У меня возникла странная проблема в очень простом проекте с использованием гибридных приложений для нескольких устройств в Visual Studio 2013 Update 2 с Apache Cordova и AngularJS. Я настроил маршрутизацию с помощью модуля ngRoute, определил div с помощью директивы ngView и просто хочу перейти на другую страницу по коду, используя службу angular $location.

Мой звонок выглядит так:

$location.path('/home');

Маршрутизация (и определение модуля) настроена следующим образом:

var app = angular.module('tk', ['ngRoute']);    

app.config(function ($routeProvider) {

   $routeProvider.when('/home', {
      templateUrl: '/app/views/home/home.html',
      controller: 'homeController'
   });

   $routeProvider.when('/login', {
      templateUrl: '/app/views/login/login.html',
      controller: 'loginController'
   });   
});

Когда код выполняется, вид не меняется! Тот же код отлично работает в Ripple, но я не могу заставить его работать в отладчике Android.

Я использую Android 4.4.2 - уровень API 19 на ARM (armeabi-v7a).

Когда вызов $location.path('/home') выполняется, я вижу в отладчике, что свойство absUrl службы $location меняет свое значение с «file:///android_asset/www/index.html» на «file:///android_asset/www /index.html#/home", но это все. Никакой навигации к представлению не происходит.

Я что-то пропустил полностью?

изменить 1: В консоли Java Script я заметил следующие сообщения:

Failed to load resource File: home.html, 
Line: 0, Column: 0 
deviceready has not fired after 5 seconds. File: cordova.js, 
Line: 1128, Column: 17 
Channel not fired: onPluginsReady File: cordova.js, 
Line: 1121, Column: 21 
Channel not fired: onCordovaReady File: cordova.js, 
Line: 1121, Column: 21

На самом деле я сейчас не использую никаких плагинов Cordova. Просто чистый Angular. Вызов $location.path() явно завершается ошибкой, потому что ресурс не может быть загружен.

Но почему это удалось в Ripple?


person MarkusS    schedule 09.07.2014    source источник
comment
Вы пытались удалить ведущий /? поэтому home вместо /home. Я не знаком с тем, как работает angular в этом отношении, но я знаю, что у Android есть некоторые проблемы с путями.   -  person Dawson Loudon    schedule 09.07.2014
comment
Привет Доусон! Спасибо за ваш комментарий! К сожалению, удаление косой черты не помогло.   -  person MarkusS    schedule 09.07.2014


Ответы (2)


Как правило, когда проект запускается на Ripple, он должен функционально работать и на других целях.

Однако Android и iOS являются платформами чувствительными к регистру. Одним из решений является просмотр вашего исходного кода и выяснение, есть ли какие-либо ссылки на файлы, сценарии или ресурсы, которые могут не учитывать регистр.

person Priyank    schedule 10.07.2014
comment
Привет, Приянк, спасибо за подсказку. В моем демонстрационном проекте у меня есть только одна ссылка, и каждая ссылка на эту ссылку написана в нижнем регистре. Насколько я могу судить, все остальные вещи angularjs (привязка данных, обработка событий) работают, но только навигация просто не работает! Если я не использую маршрутизацию angularjs и просто жестко закодирую URL-адрес, установив window.location, это изменит страницу, но это не то, что я хочу. - person MarkusS; 11.07.2014
comment
@MarkusS Вы решили это? У меня похожая проблема. Он работает в Ripple, но не на устройстве Android. - person Sealer_05; 02.12.2014
comment
@ osiris355: Ну, по крайней мере, теперь он работает с новой версией Cordova Integration в VS2015 Preview в сочетании с эмуляторами Android на основе Hyper-V. - person MarkusS; 03.12.2014

Я сам провел несколько часов, борясь с этой же самой проблемой. Доусон Лаудон был близок к своим наблюдениям за путями.. но нужно изменить не /home.. это templateUrl: это должно быть приложение, а не /приложение .

   $routeProvider.when('/home', {
      templateUrl: '/app/views/home/home.html',
      controller: 'homeController'
   });

должно быть:

   $routeProvider.when('/home', {
      templateUrl: 'app/views/home/home.html',
      controller: 'homeController'
   });

Я не знаю почему, но устройствам Android не нравится первый «/» для URL-адреса. Наверно беру рут по умолчанию. Жаль, что ребята из Ripple не совсем правильно подражают этому.

person Brett JB    schedule 22.01.2015