Угловой счетчик ионных значков не обновляется

Я новичок в угловых и считаю, что я не полностью понимаю цикл дайджеста. Я пытаюсь обновить количество значков на вкладке ion.(Используя ionic)

"Ионно-вкладка"

<ion-tab title="Requests" badge="data.badge" ng-controller="RequestTabCtrl" badge-style="badge-assertive" icon-off="ion-pull-request" icon-on="ion-pull-request" href="#/tab/requests">
<ion-nav-view name="tab-requests"></ion-nav-view>

Я написал фабрику, которая будет хранить и массив. этот массив обновляется через socket.io

"Фабрика уведомлений"

.factory('notifications',function(){
  var list = [];
  return{
    all: function(){
      return list;
    },
    add: function(data){
      list.push(data);
    },
    length: function(){
        return list.length;
    }
  };
});

.controller('RequestTabCtrl',function($scope,notifications){
  $scope.data = {
    badge : notifications.length()
    };
});

Моя проблема в том, что счетчик значков не обновляется, когда массив уведомлений обновляется через socket.io. Я проверил, что массив обновляется. На самом деле я могу записать длину массива в консоль и увидеть, как она меняется. Кроме того, я установил переменную области видимости в дочернем io-nav-view вкладки ion-tab и в результате могу видеть, что выражение {{reports.length}} обновляется в этом представлении.

.controller('RequestsCtrl', function($scope,notifications) {
  $scope.requests = notifications.all();
})

Я пробовал $watch(в RequestTabCtrl) на notifications.length. Я попытался вызвать $apply(в RequestTabCtrl), что приводит к $digest уже в процессе. Я пробовал $timeout и не вижу положительного результата (в RequestTabCtrl и функции заводской длины). Помощь мне будет высоко ценится.

2 ответа

Решение

Благодаря AjinderSingh решение было найдено.

Итак, есть два способа сделать это. Сначала используя $ интервальный подход:

.controller('RequestTabCtrl',function($scope,notifications,$interval){
    $interval(function(){
       $scope.data = {
           badge : notifications.length()
        };
    },2000);
});

Второй подход заключается в трансляции $ фабрики после добавления элемента в массив. с последующим перехватом этого события в контроллере:

.factory('notifications',function($rootScope){
  var list = [];
  return{
    all: function(){
      return list;
    },
    add: function(data){
      list.push(data);
      $rootScope.$broadcast('update');
    },
    length: function(){
        return list.length;
    }
  };
});


.controller('RequestTabCtrl',function($scope,notifications,$interval){
      $scope.$on('update',function(){
           $scope.data = {
              badge : notifications.length()
            };
       });
 });

Я выбираю второй подход, так как он кажется чище.

$ionicPlatform.ready(function() {
    $cordovaBadge.promptForPermission();

    $scope.setBadge = function(value) {
        $cordovaBadge.hasPermission().then(function(result) {
            $cordovaBadge.set(value);
        }, function(error) {
            alert(error);
        });
    }
});

Для полной ссылки, пожалуйста, проверьте https://blog.nraboy.com/2015/07/modify-the-badge-number-of-an-ionic-framework-app/

Другие вопросы по тегам