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 2014-10-19 01:18:35

回答

0

您應該使用$ resource獲取$ promise,例如:resource.query().$promise而不是$q.defer()以獲得更簡潔的代碼。否則,你很好走。你可以使用$cacheFactory,但你也可以使用local var。

在當前代碼中是不是您的共享變量?

我建議你看看ui-router及其嵌套和抽象視圖,其中解析值可用於子控制器。

相關問題