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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.