Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Refreshing Resolve Data - Ui Router

In ionic I'm resolving my data with the Ui-Router's resolve functionality before the controller is initialized. As of now I don't have to $inject my EventService into the Controller. The EventService's getEvents() method resolves the data before the controller is initialized. Everything works correctly this way, but now i'm trying to implement the Ion Refresher. I could easily refresh my $scope.events array within the controller, bloating the controller itself, because I would have to $inject the EventService into the controller, and that also means that every controller that uses the same data will have to contain logic to handle a refresh. What is the best way refresh the data outside of the controller or is that the best way?

Events State Definition and data resolution

.state('tab.events', {
    url: '/events',
    views: {
    'tab-event': {
        templateUrl: 'views/events.html',
        controller: 'EventsController',
        resolve: {
            events: function (EventService) {
                return EventService.getEvents(); //resolves data before ctrl initialized
            }
        }
    }
   }
})

Events Controller

(function() {
  'use strict'

    angular
        .module('app.events')
        .controller('EventsController', EventsController);

        EventsController.$inject = ['$scope','events'];

        function EventsController ($scope,events) {

            $scope.events = events;

        }

}
)();

Bloated Events Controller - Example

(function() {
  'use strict'

    angular
        .module('app.events')
        .controller('EventsController', EventsController);

        EventsController.$inject = ['$scope','events','EventsService'];

        function EventsController ($scope,events,EventsService) {

            $scope.events = events;

            $scope.refresh = refresh;

            function refresh () {
                clearCache(); //pretend method
                EventsService.getEvents()
                    .then(function (events) {
                        $scope.events = events;
                        $scope.$broadcast('scroll.refreshComplete');
                    })
            }
        }

}
)();

Rather than bloating the controller can I refresh this data another way?

like image 868
Abdullah Rasheed Avatar asked Oct 21 '25 04:10

Abdullah Rasheed


2 Answers

call $state.reload() which is an alias for:

$state.transitionTo($state.current, $stateParams, { 
  reload: true, inherit: false, notify: true
});

This will cause all your states to be "re-entered" which fetches the resolves and re-initializes the controllers.

like image 158
Chris T Avatar answered Oct 22 '25 17:10

Chris T


I wish a hard refresh, which is basically what a $state.reload() does wasn't the answer. I too have this issue and would rather be able to call some method that just forces all the resolved data objects to rerun. The reload causes a page refresh, which causes nasty UI artifacts.

like image 36
ewahner Avatar answered Oct 22 '25 17:10

ewahner