I have a simple resource of categories, with a cached query action:

    app.factory 'Category', ($resource) ->
     $resource "/categories/:id", {id: '@id'}, {
       query: { cache: true, isArray: true, method: 'GET' }
     }

I have multiple controllers/directives that call Category.query() to get 
all categories. The request is cached so it doesn't execute multiple HTTP 
requests, which is fine, but turns out that angular-resource returns 
different Category instances every time. If I edit one category on a 
directive it doesn't update the rest, simply because it's not the same 
instance.

*My Question: What's the recommended way to share all the instances of a 
query between all callers when using angular-resource?*


My current solution is ugly: I override the query method, call the request 
only once, cache the result in a variable, and preserve all the callbacks 
in an array, then call them at once when the request is done. It's ugly but 
it works.

    _all = null
    _loading = false
    _queryPromises = []
    oldQuery = Category.query
    
    Category.query = ->
      deferred = $q.defer()

      if _all
        deferred.resolve(_all)
      else
        _queryPromises.push deferred

        if !_loading
          _loading = true
          oldQuery (all) ->
            _loading = false
            _all = all

            _queryPromises.forEach (promise) ->
              promise.resolve(_all)
            _queryPromises.length = 0

      deferred.promise

It currently returns a promise and doesn't use a callback like 
angular-resource but this is an easy change.

I tried angular-cached-resource but got the same result.

-- 
You received this message because you are subscribed to the Google Groups 
"AngularJS" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/angular.
For more options, visit https://groups.google.com/d/optout.

Reply via email to