2017-01-17 2 views
4

Я создаю хром-приложение с USB-устройством. В моем основном app.js я хочу всегда проверять, когда устройство добавлено/удалено и изменит URL.

angular.module('rfApp', [ 
    'ngRoute', 
    'ngMaterial', 
    'rfApp.view1', 
    'rfApp.view2', 
    'rfApp.device_not_found' 
]).config(['$locationProvider', '$routeProvider', function($locationProvider, $routeProvider) { 
    $locationProvider.hashPrefix('!'); 

    function checkForDevices() { 
     RFFWHID.getDevices(function(current_devices) { 
      if(current_devices.length > 0) { 
       $routeProvider.otherwise({redirectTo: '/view1'}); 
      } else { 
       $routeProvider.otherwise({redirectTo: '/device_not_found'}); 
      } 
     }); 
    } 

    chrome.hid.onDeviceAdded.addListener(function(){ 
     checkForDevices(); 
    }); 
    chrome.hid.onDeviceRemoved.addListener(function(){ 
     checkForDevices(); 
    }); 

    checkForDevices(); 

}]); 

Но перенаправление не работает в функции async.

Edit:

Я нашел подобный вопрос How to call $urlRouterProvider.otherwise() after loading JSON file?, и первый ответ описывает, что это невозможно. Но как я могу решить эту проблему. Мне нужно проверить, чтобы usb удалял/добавлял глобально и менял представления на основе этого.

ответ

1

Сложно отлаживать, так как у меня сейчас нет среды для приложений Chrome, но вы можете изменить подход. Вместо того, чтобы перенаправлять с $ routeProvider, вы можете использовать $ routeChangeSuccess:

angular.module('rfApp') 
 
.factory('deviceManager', ($rootScope) => { 
 
    let deviceConnected = false; 
 
    
 
    chrome.hid.onDeviceAdded.addListener(function() { 
 
     checkForDevices(); 
 
    }); 
 
    chrome.hid.onDeviceRemoved.addListener(function() { 
 
     checkForDevices(); 
 
    }); 
 

 
    checkForDevices(); 
 
    return { 
 
     isDeviceConnected: isDeviceConnected 
 
    }; 
 

 
    function isDeviceConnected() { 
 
     return deviceConnected; 
 
    } 
 

 
    function checkForDevices() { 
 
     RFFWHID.getDevices(function(current_devices) {    
 
      deviceConnected = current_devices.length > 0; 
 
      $rootScope.$emit('deviceChange'); 
 
     }); 
 
    }  
 
}) 
 
.run(($rootScope, $location, deviceManager) => { 
 
    $rootScope.$on('$routeChangeSuccess', checkAndRedirect); 
 
    $rootScope.$on('deviceChange', checkAndRedirect); 
 

 
    function checkAndRedirect() { 
 
     if (deviceManager.isDeviceConnected()) { 
 
      $location.url('/view1') 
 
     } else { 
 
      $location.url('/device_not_found'); 
 
     } 
 
    } 
 
});

Так в основном каждый раз, когда изменяется состояние, проверить, если устройство подключено синхронным образом, и вы можете перенаправить пользователь использует $location.url или все, что подходит вам лучше всего.

Редактировать: Я добавил пользовательское событие $ rootScope, которое запускается, когда устройство подключено/отключено. Теперь ваше приложение должно автоматически изменять состояние при каждом запуске события.

+0

спасибо за ответ, но он не работает :(Так что, когда USB-устройство добавлено, я должен сделать это 'if (deviceManager.isDeviceConnected()), а затем сделать перенаправление для просмотра. – Arti

+0

@Arti Когда устройство подключено, выполните 'checkForDevices', вы используете' isDeviceConnected', чтобы проверить синхронизацию, если есть хотя бы одно устройство, не дожидаясь 'RFFWHID.getDevices'. Извините, но у меня не было возможности проверить его, это просто Например, чтобы дать вам представление о подходе, который вы могли бы выполнить. Btw, есть ли у вас какие-либо ошибки? Почему он не работает? Может быть, я могу его улучшить. – pietrovismara

+0

проблема с этим ударом '$ rootScope. $ on ('$ routeChangeSuccess «только один раз, когда я меняю URL-адреса. Но когда я запускаю приложение и удаляю устройство, он запускает« chrome.hid.onDeviceRemoved »и мой url должен измениться – Arti

Смежные вопросы