I do something like what I pasted below.
Recommendations is a service that is a subclass of the following PagedView
function RecommendationsCtrl($location, User, Data, Books,
Recommendations) {
this.service = new Recommendations({
isInfiniteScroll: true,
loadData: Data.get()
});
this.user = User;
this.categoriesDropdown = Books.categoriesDropdown();
console.log('RecommendationsCtrl this', this);
}
(disregard the timeago method if it offends you :) )
(function () {
'use strict';
function PagedViewFactory($location, $timeout, Data) {
var PagedView = function (options) {
// console.log('PagedView options', options);
if (!options) {
return;
}
this.getUrl = options.path || $location.path();
this.isInfiniteScroll = options.isInfiniteScroll || false;
if (angular.isObject(options.loadData)) {
this.items = options.loadData.items;
this.pager = options.loadData.pager;
this.loading = false;
this.initLoad = true;
this.noItems = this.items.length;
this.noMoreItems = (this.pager.pages === 1);
} else {
this.items = false;
this.pager = false;
this.loading = false;
this.initLoad = false;
this.noItems = false;
this.noMoreItems = false;
}
}
PagedView.prototype.toString = function() {
return '[PagedView "' + this.getUrl + '"]';
};
PagedView.prototype.applyTimeago = function() {
$timeout(function() {
jQuery('abbr.timeago').timeago();
}, 0, true);
};
PagedView.prototype.set = function (items) {
this.items = items;
};
PagedView.prototype.get = function (pageNum) {
var self = this;
pageNum = pageNum || 0;
this.loading = true;
var options = {
params: {
page: pageNum
}
},
promise = Data.load(this.getUrl, options);
promise.success(function (data) {
//console.log('PagedView.get promise data', data);
self.initLoad = true;
self.loading = false;
if (!self.isInfiniteScroll) {
self.noMoreItems = true;
}
self.pager = data.pager;
if (angular.isArray(self.items) && pageNum !== 0) {
angular.forEach(data.items, function (item) {
self.items.push(item);
});
} else {
self.items = data.items;
}
self.applyTimeago();
});
};
PagedView.prototype.nextPage = function () {
if (this.pager) {
if (this.pager.page === -1) {
this.noItems = true;
} else if (this.pager.page === (this.pager.pages - 1)) {
this.noMoreItems = true;
} else {
this.get(this.pager.page + 1);
}
} else {
this.get();
}
};
PagedView.prototype.getItemAt = function (itemIndex) {
return this.items[itemIndex];
};
return PagedView;
}
angular.module('app.pagedView', [
'infinite-scroll'
])
.factory('PagedView', PagedViewFactory)
;
})();
On Fri, Sep 5, 2014 at 6:49 AM, steven smock <[email protected]> wrote:
> Ganaraj,
>
> Sounds like a fun problem, to me... but then, I just learned about it this
> morning. :-)
>
> How about this approach:
>
> 1. Define a type within your (singleton) service; you will use this
> for your "non-singleton service instances."
> 2. Give your service a factory method which accepts context as an
> argument, and returns an instance of the type defined in (1).
> 1. If you need access to other objects created by this factory,
> maintain a hash of them within your service, and then give the service
> some
> retrieval methods.
> 1. You could even make this structure hierarchical, if you
> wanted to.
> 3. Continue to inject the service as you are doing, relying
> primarily on its factory method; consume instances with your
> controller/directive.
>
> What do you think?
>
>
> On Thursday, September 4, 2014 7:15:20 AM UTC-4, ganaraj P R wrote:
>>
>> Hi,
>>
>> We are facing an issue where we need to be sharing non singleton states
>> between controllers. I have explained it in more detail in here
>>
>> http://stackoverflow.com/questions/25663978/sharing-
>> non-singleton-state-between-controllers-angular-architecture
>>
>> I would welcome any discussion regarding this. As more and more apps get
>> built with Angular and the more larger apps that get built with it - Things
>> start getting larger and complicated - A community driven way of figuring
>> out common architectural patterns and anti-patterns would be amazing.
>>
>>
>>
>> --
>> Regards,
>> Ganaraj P R
>>
> --
> 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.
>
--
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.