docs: function (pageIndex, callback, noPageCheck) {
  
              if (this.$loadingPage) {
                  if (callback) {
                      callback();
                  }
                  return;
              }
              var self = this;
  
              function cb(err) {
                  if (callback) {
                      callback(err);
                  }
                  self.$loadingPage = false;
              }
  
              if (this.hasPage(pageIndex)) {
                  this.$loadingPage = true;
  
                  var i;
                  pageIndex = pageIndex || 0;
                  noPageCheck = _.isUndefined(noPageCheck) ? true : noPageCheck;
  
                  if (!this.$.baseList || (!noPageCheck && pageIndex === this.$.page)) {
                      // nothing to do
                      cb();
                      return;
                  }
  
                  var list = this.$.list;
                  var baseList = this.$.baseList;
  
                  list.clear();
  
                  // add items
                  var startIndex = this.$.pageSize * pageIndex;
                  if (baseList.$items.length > startIndex) {
                      for (i = 0; i < this.$.pageSize; i++) {
                          list.add(baseList.at(startIndex + i));
                      }
                  }
  
  
                  if (baseList instanceof Collection) {
                      // determinate pages to load based on the page size
                      var collectionPageSize = this.$.baseList.$.pageSize;
  
                      var collectionStartPage = this._itemIndexToPageIndex(this._pageIndexToItemIndex(pageIndex), collectionPageSize);
                      var collectionEndPage = this._itemIndexToPageIndex(this._pageIndexToItemIndex(pageIndex + 1) - 1, collectionPageSize);
  
                      var pageIndices = {};
                      for (i = collectionStartPage; i <= collectionEndPage; i++) {
                          pageIndices[i] = i;
                      }
  
  
                      flow()
                          .seq("execId", function () {
                              return ++self.$execId;
                          })
                          .parEach(pageIndices, function (pageIndex, cb) {
                              baseList.fetchPage(pageIndex, null, cb);
                          })
                          .exec(function (err, results) {
  
                              if (!err && results.execId == self.$execId) {
                                  var items = [];
                                  for (i = collectionStartPage; i <= collectionEndPage; i++) {
                                      items = items.concat(results[i].$items);
                                  }
  
                                  self._calculatePageCount();
  
  
                                  var viewStartIndex = self._pageIndexToItemIndex(pageIndex, self.$.pageSize);
                                  viewStartIndex -= collectionStartPage * collectionPageSize;
                                  if (viewStartIndex < items.length) {
                                      // remove overlapping at start and end
                                      items = items.slice(viewStartIndex, viewStartIndex + self.$.pageSize);
  
                                      // and reset list
                                      self.$.list.reset(items);
                                  }
                              }
                              self.set('page', pageIndex);
                              cb(err);
                          });
  
                  } else {
                      self._calculatePageCount();
                      self.set('page', pageIndex);
                      cb();
                  }
              } else {
                  this._calculatePageCount();
                  cb();
              }
  
          }