2014-05-14 4 views
4

저는 AngularJS 서비스를 가지고 있으며 서버의 JSON 객체를 사용하여 배열을 가져옵니다.AngularJS : 서비스의 약속에서 반환 된 배열 검색

서비스에서 "getElementByID (ID)"함수가 필요합니다. (또는 요소를 XY로 가져옴)

내 문제는 검색을 시작할 때 목록이 아직 없다는 것입니다. 서비스 자체에서 약속을 해결하지 못하는 것 같습니다. 항상 외부에서 해결해야합니까? http://plnkr.co/edit/Hlyg3mGPi7RKFHmcK1ZM?p=preview

어떻게 서비스의 약속 배열을 검색 할 수 있습니다

나는 여기에 문제를 설명하는 Plunker을 만들어?

도움 주셔서 감사합니다.

+0

참고 : JSON은 데이터 직렬화 형식입니다. JSON은 문자열로 항목을 직렬화하고 JS 객체 배열이있는 JS (및 다른 언어)로 역 직렬화하는 데 사용합니다. –

답변

2

당신이 맞다, 배열 작업을 위해서 - 먼저 .then으로 약속을 풀고 반환 값이 또 다른 약속이라는 사실을 사용해야합니다. 예를 들어

: 당신은 예를 들어, 한 번 데이터를 가져 오는 방법을 만들 수 있습니다

// return if in a service method 
var p = $http.get("http://jsonurl").then(function(result){ 
    return result.filter(function(el){ return el.id === "foo"}); 
}); 

p.then(function(value){ 
    // value is an array that contains only elements with property `id === "foo"` 
}); 

:

var data = null; 
function getData(){ 
    return $q.when(data || $http.get("http://jsonurl")).then(function(val){ 
     return data = val; // cache and return the result; 
    }); // either data, or cached data 
} 

을 지금을, 당신은 당신의 서비스에 getByPredicate를 만들 수 있습니다

function get(predicate){ 
    return getData().then(function(arr){ 
      return arr.filter(predicate); 
    }); 
} 

다음 중 어떤 것을 할 수 있습니까?

get(function(el){ return el.id === "foo"; }).then(function(values){ 
    //values is all the array elements with an id property whose value is foo. 
}); 
+0

@BenjaminGruenbaum에 감사드립니다! 그것은 논리적으로 들리지만 - 어쨌든 나는 그것을 작동시키지 못합니다. "Get"함수는 필터에서 아무 것도 반환하지 않지만 배열은 이미 있습니다. 나는 여기에서 그것을 시험해 보았다. http://plnkr.co/edit/oiaVYDQiB9kgpm96ptL2?p=preview – ulilicht

+0

@ulilicht 당신은 $ http 대신에 $ resource를 호출하고 그것의 끝 부분에'. $ promise'를하지 않았다. 자원에 대한 약속을 되 돌린다. 그런 다음 배열에 .query를 호출하고 있습니다. –

+0

오케이, 작동 해 주셔서 감사합니다. 작업 플러 커는 다음에서 찾을 수 있습니다. http://plnkr.co/edit/oiaVYDQiB9kgpm96ptL2?p=preview 하나의 열린 지점 : '데이터'가 캐시되지 않는 이유는 무엇입니까? 서비스가 싱글 톤이되어서는 안됩니까? 현재 콘솔에서 5 개의 get 요청을 볼 수 있습니다. – ulilicht

관련 문제