2014-04-18 35 views
0

由於一些特殊的情況,我目前正忙於使用AngularJS創建一個僅客戶端,無服務器的應用程序。它的唯一目的(目前)是讀取上傳.json文件,其中包含對象活動的數組如下:

[{ 
    "id": "sta", 
    "title": "IT Strategy & Governance", 
    "type": "management", 
    "order": 1 
}, 
{ 
    "id": "por", 
    "title": "Portfolio Management", 
    "type": "management", 
    "order": 2 
}, 
{ 
    "id": "org", 
    "title": "Organization & Process Management", 
    "type": "management", 
    "order": 3 
}] 

請記住,這個文件是靜態的,而不是由任何形式的產生後端。我現在想達到目標。

目標1是加載這個完整的對象列表。我做到這一點使用角$資源,如下所示,它精美的作品:

服務:

pexServices.factory('Activities', function($resource) { 
    return $resource('data/activities.json', {}); 
}); 

控制器:

pexControllers.controller('ActivityCtrl', 
    function($scope, Activities) { 
     $scope.activities = Activities.query(); 
    } 
); 

目標2是走出一個個人紀錄這個數組,通過它的ID選擇它。像以前一樣,數據應該從包含所有數據對象的大數據文件中抽出。

我的想法太添加自定義得到功能上面已經介紹了$資源,包括一些transformResponse代碼提取請求的元素:

pexServices.factory('Activities', function($resource) { 
    return $resource('data/activities.json', {}, { 
     get: { 
     method: "GET", 
     transformResponse: function(rawData, headersGetter) { 
      var jsonData = jQuery.parseJSON(rawData); 
      var requestedObject = jsonData.filter(function(activity) { 
       return activity.id == "THEREQUESTEDID"; 
      }); 
      return requestedObject.shift(); 
     } 
    } 
    }); 
}); 

這個偉大的工程,但只是作爲長因爲我在THEREQUESTEDID硬編碼請求的ID。不過,我當然希望一個變量參數傳遞到get函數以拉所需要的對象,像這樣:

$scope.activity = Activities.get({activityId: "sta"}); 

不幸的是,這是我一直堅持了一段時間,現在的點。如何啓用一個參數從我的控制器一直傳遞到transformResponse函數,我可以使用它來過濾數組?

如前所述,文件本身是靜態的,不會對任何參數做出反應,所以我需要在客戶端手動執行過濾。

非常感謝您的支持,並牢記我有限的JS技能。 :-)

(如果你有另一個完全不同的解決我的問題在腦海,請隨時和分享吧!這只是我的第一炮。)

回答

0

不是這樣!你需要用方法創建一個服務並將你的資源對象包含進去。該服務將是這樣的

pexServices.factory('Activities', function ($resource) { 
    var service = {}; 
    var cachedActivities = []; 
    service.getAll = function() { 
     cachedActivities = $resource('data/activities.json', {}); 
     return cacheActivities; 
    } 
    service.getActivity = function (id) { 
     var requestedObject = jsonData.filter(function (activity) { 
      return cachedActivities.id == id; 
     }); 
     return requestedObject.shift(); 
    } 
    return service; 
}); 

現在你的服務有2個方法,一個列表和一個具體的活動。此外,從服務器檢索的活動將緩存在局部變量中。這裏唯一的問題是getActivity只有在您首先撥打getAll才能使用。如果你想解決它,轉向基於承諾的方法。

+0

非常感謝您的意見。一旦我的JS技能進一步提升,我會再次詳細考慮它! – Joshua

相關問題