событие backbutton (cordova) не влияет на переменные контроллера angularjs, как ожидалось

0

Я получаю непредсказуемые результаты от попытки интегрировать cordova.js в свой угловой контроллер.

    <div class="side-menu" ng-class="{'show_menu' : show_menu }" ng-swipe-left="show_menu = !show_menu"> // more stuff</div>

INITAL CODE:

   $scope.init =function() {

        document.addEventListener("deviceready", $scope.onDeviceReady, false);
    }

   $scope.onDeviceReady = function() {

       document.addEventListener("backbutton", $scope.onBackKeyDown, false);
    }

ЗА РАБОТОЙ:

  $scope.onBackKeyDown = function($scope) {
        alert('backbutton pressed');
    }

ТАКЖЕ РАБОТАЕТ

Это вызывает функцию (не связанную с show_menu и show_menu меняет состояние show_menu

$scope.onBackKeyDown = function() {
    $scope.filterby('dance');
    $scope.show_menu = !$scope.show_menu;
}

НЕ РАБОТАЕТ

Просто ничего здесь не происходит

$scope.onBackKeyDown = function() {
    $scope.show_menu = !$scope.show_menu;
}

У меня $scope.show_menu объявлено как false, как только контроллер начнет, поэтому я не могу понять, почему он полагается на несвязанную функцию, которая должна быть вызвана до того, как она начнет работать.

РЕДАКТИРОВАТЬ:

Я обнаружил, что он работает, но он ждет, пока не появится следующее событие angularjs. например, ничего не происходит с меню, но затем, если я нажму кнопку триггера после другого события, которое не связано с меню, ТОГДА изменяется состояние меню.

Теги:
cordova

1 ответ

0
Лучший ответ

Вы можете использовать угловые события $ apply(), а addEventListener - отдельные, поэтому иногда вам нужно использовать "$ apply()", потому что он обновляет угловой код. В качестве альтернативы вы можете использовать Factory или Service для отслеживания переменных, которые вы передаете между событиями. Еще один вариант был бы, если бы вы хотели избежать использования применения, используйте пример "контроллер как синтаксис" ng-controller = "AppCtrl as app", затем присоедините свои переменные как app.show_menu, например.

  • 0
    как FYI - я обнаружил, что пустой $timeout(function(){}, 0, true) безопаснее, чем $apply() причина в том, что $ timeout (с true) ставит в очередь перерисовку сразу в конце последнего перезаписи, в то время как $apply() может выдать ошибку $digest already in progress выполняется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню