Hi Eric. I'm actually using
Restangular: https://github.com/mgonto/restangular
It has some features that is easy to work with, instead of using $resource
or $http.
And I thought of using a javascript class like:
var ScoreModel = function(score, voters, witnesses) {
}
Then I would use like: new ScoreModel(score, voters, witnesses)... After I
get all of these with Restangular.
On Saturday, May 24, 2014 8:23:10 PM UTC-3, Eric Eslinger wrote:
>
> One thing that can make your life a little bit easier is the $q.all
> function - it accepts an array of promises and resolves into an array of
> resolved values, as long as the promises all resolve (and it will activate
> error resolution if any of the promises error out). I'm pretty sure that
> the nested forEach thenable stuff will miss errors if the voters call
> errors out, but I'm not 100% sure of that. I also tend to use $http over
> $resource personally, so this may not be right either.
>
> $q.all(scores.map(function(score) {
> return score.getList('voters') //assuming getList returns a promise for
> the list
> })).then(function (votersArray) {
> //do something with the votersArray like put votersArray[i] on
> $scope.votes[i].voters for all values of i.
> return $q.all(scores.map(function(score) {
> return score.getList("witnesses")
> })).then(function (witnessArray) {
> //more here
> }).catch(function (error) {
> //process error
> })
>
> But yeah, there's a lot of $http calls there, which is annoying. It's just
> ugly at times, and if you have multiple controllers and pages with the same
> kinds of data models, you'll be Repeating Yourself.
>
> Personally, I had to deal with a general-case problem of having
> side-loaded lists of models attached to other models (Users have Posts,
> Communities have Users, etc). I ended up using Object.defineProperty to
> make a property like User.posts, where in the getter function it looks like:
>
> get: function() {
> //check to see if this._cache.promise exists, if not, set it equal to
> $http.get('appropriate url')
> // this._cache.promise.then (val)=> this._cache.values = val
> // this._cache.values ?= []
> // return this._cache.values
> }
>
> It's not the simplest solution on the back end, but on the front end, you
> can just put a User object on the scope and then have user.posts do what
> you expect it to do without needing to worry about manually resolving
> side-loaded promises. If an object's side-loaded list doesn't get touched
> by angular, it doesn't load, and if it does, the first time through it'll
> look like an empty list, but as soon as the $http promise resolves angular
> takes care of the rest. If you really need to wait on the call, you can
> manually grab the promise out of the cache and then it. It more or less
> covers for the way angular used to do promise unwrapping in views, but
> without getting hung up in edge cases.
>
> e
>
>
>
> On Sat, May 24, 2014 at 10:42 AM, Joberto Diniz
> <[email protected]<javascript:>
> > wrote:
>
>> Hi, I'm using Restangular.
>> I need to build a model which is built from 3 calls to the api, how can I
>> do that?
>> To get my model ready to show, I need to call the following urls:
>>
>> api/scores/{id}
>> api/scores/{id}/voters
>> api/scores/{id}/witnesses
>>
>> Also, when I call api/scores it return all the scores, and then for each
>> one, I need to call /voters and /witnesses.
>>
>> I thought of creating a javascript class ScoreModel which would have all
>> the score properties along with the voters and witnesses, then bind the
>> ScoreModel array to $scope. But how to coordinate the Restangular calls to
>> build the model?
>>
>> I drafted something, but it's just plain ugly!
>>
>> scoreApp.factory('Scores', ['Restangular', function (Restangular) {
>> return Restangular.service('scores');
>> }]);
>>
>> var promise = Scores.getList({ timeUp: false });
>> $scope.promise = promise;
>> promise.then(function (scores) {
>> //$scope.scores = scores;
>> var promises = [];
>> scores.forEach(function (score) {
>> promises.push(score.getList('voters'));
>> });
>> $scope.promise = promises;
>> promises.forEach(function (promise) {
>> promise.then(function (voters) {
>>
>> });
>> });
>> }, function (data) {
>> toaster.pop('error', '', 'Sorry, but an error occured');
>> });
>>
>> --
>> 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] <javascript:>.
>> To post to this group, send email to [email protected]<javascript:>
>> .
>> Visit this group at http://groups.google.com/group/angular.
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
--
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.