2015-07-09 111 views
1

這裏返回特定的對象是我services.js是什麼樣子:從JSON對象數組

var app = angular.module('starter.services', []) 


    .factory('Studies',function($http,$filter){ 
     var studies = []; 
     $http.get("studies.json").success(
       function(data){ 
        //studies = data; 
        angular.copy(data, studies); 
       } 
      ); 
     single_object = $filter('filter')(studies, function (d) {return d.nodeRef === "56e3382b-9a76-48ee-9c14-907e71b7a184";})[0]; 
     console.log(single_object); 
     return { 
     all: function(){ 
      return studies; 
     } 
    }; 
    }) 

所以你可以看到我做這包含屬性「nodeRef」對象JSON文件的GET請求恰好是一個屬性。我想根據它的noderef匹配過濾掉一個特定的對象。目前console.log返回「未定義」我想這可能是因爲它在json文件被加載之前被調用。如果有人能提供解決方案,我將非常感激。

+3

把你的過濾邏輯的'GET'回調內部。 – tymeJV

+0

我該怎麼做呢?嗯,我想整個JSON文件,因爲我需要它的其他操作以及之後,我想要執行過濾器。 – user1585869

回答

1

您正在執行異步請求並在服務器的響應之前觸發過濾器,因此您得到undefined的原因是因爲此時您正在將過濾器應用於空數組。

你應該將你的過濾器調用success塊內,使它的工作,只要你想:

VAR應用= angular.module( 'starter.services',[])

.factory('Studies',function($http,$filter){ 
    var studies = []; 
    $http.get("studies.json").success(
      function(data){ 
       //studies = data; 
       angular.copy(data, studies); 
       single_object = filter("56e3382b-9a76-48ee-9c14-907e71b7a184"); 
       console.log(single_object); 
      } 
     ); 
    function filter(node) { 
    if (studies.length > 0) { 
     return $filter('filter')(studies, function (d) {return d.nodeRef === node;})[0]; 
    } 
    } 
    return { 
    all: function(){ 
     return studies; 
    }, 
    filtered: filter 
}; 
}) 
+0

好吧,這是我不想在回調過程中只執行一次過濾器。如果我想運行JSON數組的過濾函數多次從我的控制器?這就是爲什麼我正在考慮編寫另一個返回函數,如所有調用get:function(noderef),控制器可以調用返回特定對象noderef匹配 – user1585869

+0

檢查我的你可以使用y中的.then()函數運行過濾器我們的控制器 –

+0

@ user1585869,檢查我的更新答案。現在它創建一個可以從外部調用的函數。你只需要確定元素被加載,如果沒有,它將返回false。但可能你可以假設他們在外部調用函數時會做好準備。 – Mindastic

0

你是正確的控制檯顯示「未定義」,因爲在ajax請求尚未填充研究。移動過濾器和控制檯登錄到.success功能:也

$http.get("studies.json").success(
      function(data){ 
       //studies = data; 
       angular.copy(data, studies); 
       single_object = $filter('filter')(studies, function (d) {return d.nodeRef === "56e3382b-9a76-48ee-9c14-907e71b7a184";})[0]; 
       console.log(single_object); 
      } 
     ); 

,我想你需要一個承諾這裏更新研究它完成時。退出Angular $q

您將返回承諾,然後在$ http.success函數中解析它,如下所示: var deferred = $ q.defer(); .factory( '研究',函數($ HTTP,$ Q,$過濾器){

var studies = []; 
    $http.get("studies.json").success(
      function(data){ 
       //studies = data; 
       angular.copy(data, studies); 
       //At this point you can filter data as required, or not at all. I would suggest returning the entire JSON response and not filtering here at all, let the controllers filter the data as needed to maintain a layer of separation between controller and service. 

       deferred.resolve(studies); 
      } 
     ); 

    return { 
    all: function(){ 
     return deferred.promise; 
    } 
}; 
//In your controller, or wherever else... 
Studies.all().then(function(studies){ //this will fire when everything is all done. The studies variable is a full JSON object returned from the server (See deferred.resolve() in the service class). Filter here accordingly: 
$scope.studies = $filter('filter')(studies, function (d) {return d.nodeRef === "56e3382b-9a76-48ee-9c14-907e71b7a184";})[0]; 
}) 
+0

從我的控制器,我可以這樣做:'$ scope.studies = Studies.all(); $ scope.x = Studies.get(「56e3382b-9a76-48ee-9c14-907e71b7a184」);'我將在運行過濾器的服務中定義一個get函數。這會工作嗎? – user1585869

+0

你仍然有使用承諾模式:Studies.all()。然後(函數(響應){$ scope.studies =響應; /和其他任何你想做的$ scope.studies這裏)); –

+0

Studies.all()。then(function(studies){//當一切都完成時,這將會觸發 })如果我想返回我的整個研究json數組,我該怎麼做? – user1585869