2015-06-12 3 views
3

Я создаю приложение Ionic, которое вытягивает статьи с сайта joomla K2. Я использую $ http и просто заканчиваю свой url '' format = json ', и это работает отлично. Однако на веб-сайте я вытаскиваю данные из обновлений своих статей каждые несколько минут, поэтому мне нужно, чтобы пользователь мог обновить страницу. Я реализовал Ionics pull, чтобы обновить, и это работает набухание, за исключением того, что вместо того, чтобы просто втягивать новые статьи, он просто добавляет все статьи в мой массив. Есть ли вообще что-то, возможно, перебирать текущие временные метки или идентификаторы статей (я кэширую статьи в localStorage), чтобы просто принести новые статьи? Моя фабрика выглядит следующим образом:Потяните, чтобы обновить дублирование данных

.factory('Articles', function ($http) { 
    var articles = []; 
     storageKey = "articles"; 

    function _getCache() { 
     var cache = localStorage.getItem(storageKey); 
     if (cache) 
      articles = angular.fromJson(cache); 
    } 


    return { 
     all: function() { 
      return $http.get("http://jsonp.afeld.me/?url=http://mexamplesite.com/index.php?format=json").then(function (response) { 
       articles = response.data.items; 
       console.log(response.data.items); 
       return articles; 
      }); 
     }, 

     getNew: function() { 
      return $http.get("http://jsonp.afeld.me/?url=http://mexamplesite.com/index.php?format=json").then(function (response) { 
       articles = response.data.items; 
       return articles; 
      }); 
     }, 

     get: function (articleId) { 
      if (!articles.length) 
       _getCache(); 
      for (var i = 0; i < articles.length; i++) { 
       if (parseInt(articles[i].id) === parseInt(articleId)) { 
        return articles[i]; 
       } 
      } 
      return null; 
     } 
    } 
}); 

и мой контроллер:

.controller('GautengCtrl', function ($scope, $stateParams, $timeout, Articles) { 
    $scope.articles = []; 
    Articles.all().then(function(data){ 
     $scope.articles = data; 
     window.localStorage.setItem("articles", JSON.stringify(data)); 
    }, 

    function(err) { 
     if(window.localStorage.getItem("articles") !== undefined) { 
      $scope.articles = JSON.parse(window.localStorage.getItem("articles")); 
     } 
    } 

    ); 

    $scope.doRefresh = function() { 
    Articles.getNew().then(function(articles){ 
     $scope.articles = articles.concat($scope.articles); 
     $scope.$broadcast('scroll.refreshComplete'); 
    }); 
    }; 
}) 
+0

Лучше всего было бы использовать параметры запроса, чтобы извлекать только те статьи, которые у вас еще нет с сервера. – devqon

+0

Проблема в том, что я не могу найти документацию о функциональности Joomla K2 JSON. Он предоставляет опцию ограничения, но, похоже, она не работает с такой функциональностью. – letterman549

ответ

2

Используйте underscore.js к простой функциональности фильтрации.

Например:

получить все идентификаторы из уже загруженных элементов (я полагаю, что есть некоторые уникальные поля, такие как идентификатор)

http://underscorejs.org/#pluck

var loadedIds = _.pluck($scope.articles, 'id'); 

Отклонить все детали, если item.id является уже в списке loadedIds.

http://underscorejs.org/#reject

http://underscorejs.org/#contains

var newItems = _.reject(articles, function(item){ 
    return _.contains(loadedIds, item.id); 
}); 

Регистрация новых элементов и existings:

$scope.articles = newItems.concat($scope.articles); 

или

http://underscorejs.org/#union

$scope.articles = _.union(newItems, $scope.articles); 

Фактически _.union() может управлять и удалять дубликаты, но я бы пошел на ручную фильтрацию, используя item.id.

+0

Thanx много! работал отлично. Удивленная такая функциональность не встроена в угловую – letterman549