2015-07-09 107 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