3

Я использую следующую фабрику для получения данных из API и сохранения их в локальной переменной apiData.Обмен данными между контроллерами в AngularJS

app.factory('MyFactory', function($resource, $q) { 

    var apiData = []; 
    var service = {}; 

    var resource = $resource('http://example.com/api/sampledata/'); 

    service.getApiData=function() { 
     var itemsDefer=$q.defer(); 
     if(apiData.length >0) { 
      itemsDefer.resolve(apiData); 
     } 
     else 
     { 
      resource.query({},function(data) { 
       apiData=data; 
       itemsDefer.resolve(data) 
      }); 
     } 
     return itemsDefer.promise; 
    }; 

    service.add=function(newItem){ 
     if(apiData.length > 0){ 
      apiData.push(newItem); 
     } 
    }; 

    service.remove=function(itemToRemove){ 
     if(apiData.length > 0){ 
      apiData.splice(apiData.indexOf(itemToRemove), 1); 
     } 
    }; 

    return service; 

}); 

Я впрыскивать apiData в мои контроллеры следующим образом:

$routeProvider 
    .when('/myview', { 
     templateUrl: 'views/myview.html', 
     controller: 'MyController', 
     resolve: { 
      queryset: function(MyFactory){ 
       return MyFactory.getApiData(); 
      } 
     } 
    }) 

app.controller('MyController', ['$scope', 'queryset', 
    function ($scope, queryset) { 
     $scope.queryset = queryset; 
    } 
]); 

это хороший способ разделить обещание между различными контроллерами или я лучше использовать местное хранение или даже CacheFactory?

Как переписать методы MyFactory add() и remove(), чтобы я мог сохранить свою общую переменную в текущем состоянии (нет необходимости в обновлении/создании/удалении API)?

Спасибо!

+0

Возможный дубликат [Обмен данными между контроллерами AngularJS, но имеющие общие данные, поступают из вызова Ajax] (http://stackoverflow.com/questions/15097961/sharing-data-between-angularjs-controllers-but-having- заместитель разделяемых данные пришли-с) – rxgx

ответ

0

Вы должны использовать $ resource, чтобы получить $ prom, например: resource.query().$promise вместо $q.defer() для более чистого кода. В противном случае вам хорошо идти. Вы можете использовать $cacheFactory, но вы также можете использовать локальный var.

Не ваша общая переменная в текущем состоянии с текущим кодом?

Я рекомендую вам взглянуть на ui-router и его вложенные и абстрактные виды, где разрешенные значения доступны для дочерних контроллеров.

 Смежные вопросы

  • Нет связанных вопросов^_^