簡體   English   中英

從JSON對象數組返回特定​​對象

[英]Return specific object from a JSON object array

這是我的services.js的樣子:

    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文件進行了獲取請求,恰好是一個屬性。 我想根據匹配的noderef篩選出一個特定的對象。 目前,console.log返回“ undefined”,我認為這可能是因為它甚至在json文件加載之前就被調用了。 如果有人可以提供解決方案,我將不勝感激。

您正在執行異步請求,並在服務器響應之前觸發了過濾器,因此這就是為什么undefined原因,因為此時,您正在將過濾器應用於空數組。

您應該將過濾器調用移至success塊內,以使其按需運行:

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("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
};
})

沒錯,控制台顯示“未定義”,因為在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];
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM