2
\$\begingroup\$

I'm learning Angular and I don't like my current approach. The current controller uses first Geolocation service and when getLocation() is resolved, then the Pagination service is invoked with the location param. Is it any better solution to provide one service that query server with location? Can I integrate the Pagination service to call it through the Post factory with a resolved location?

angular.module('app').controller('MainCtrl',['$scope','Post','Pagination','Geolocation'
  ($scope, Post, Pagination, Geolocation) ->
    $scope.posts = []
    Geolocation.getLocation().then (location) ->
      Pagination.paginate $scope, Post, 10, (postsRes) ->
        $scope.posts.push posts for posts in postsRes
      , params: {location: location}
])

angular.module('app').factory 'Post', ($resource) ->
  $resource '/posts/:id.json', { id: '@id' }

angular.module('app').service "Geolocation", ['$q', '$window', ($q, $window) ->
  @getLocation = ->
    deferred = $q.defer()
    return deferred.resolve @loc if @loc
    if $window.navigator and $window.navigator.geolocation
      $window.navigator.geolocation.getCurrentPosition (position) ->
        @loc = position.coords
        deferred.resolve position.coords

    deferred.promise
]
angular.module('app').service 'Pagination', ->
  @paginate = ($scope, @resource, @maxElemPerPage=10, @onNewPage, @query={}) ->
    @page = 1
    @canLoadNextPage = true
    $scope.loadPage = (promise) =>
      return promise.resolve() unless @canLoadNextPage
      @load promise

    @load = (promise) =>
      @canLoadNextPage = false
      q = angular.extend @query, page: @page
      @resource.query q, (resources) =>
        @canLoadNextPage = true if resources.length is @maxElemPerPage
        @page++
        @onNewPage resources if @onNewPage
        promise.resolve() if promise

    @load()
  @
\$\endgroup\$

0

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.