2013-04-02 5 views
5

내가 한 것. 특정 지시어가있는 controllerA에서 json으로 YouTube API에서 동영상 목록을 검색합니다. json에는 비디오 목록과 비디오 자체가 들어 있습니다.AngularJS는 컨트롤러에서 다른 컨트롤러로 데이터를 전달합니다.

내가 원하는 것을. 비디오를 클릭하면 이전에 요청한 json 데이터를 사용하여 다른 컨트롤러 B와 함께 다른 ng-view에 비디오의 세부 정보를 표시 할 수 있습니다. AngularJS와 함께 시작할 때 controllerA

+0

서비스를 만들어야합니다.이 게시물을 확인하십시오. http://stackoverflow.com/a/12009408/2104976 – callmekatootie

답변

15

이 공통 의문 중 하나에 $ HTTP 서비스 사용이다 -

그래서 제 질문은 는

이 controllerB하는 controllerA에서 데이터를 전달하는 방법이다. 귀하의 요구 사항에 따라 최선의 선택은 이며 영화 목록을 검색 한 다음 controllerAcontrollerB에서이 서비스를 사용하는 것입니다.

module.factory('youtube', function() { 
    var movieListCache; 

    function getMovies(ignoreCache) { 
    if (ignoreCache || !movieListCache) { 
     movieListCache = $http...; 
    } 

    return movieListCache; 
    } 

    return { 
    get: getMovies 
    }; 
}); 

은 그럼 그냥 두 컨트롤러에서이 서비스를 주입.

module.controller('controllerA', ['youtube', function(youtube) { 
    youtube.get().then(function doSomethingAfterRetrievingTheMovies() { 
    }); 
}]); 

module.controller('controllerB', ['youtube', function(youtube) { 
    youtube.get().then(function doAnotherThingAfterRetrievingTheMovies() { 
    }); 
}]); 

B에서 사용하기 전에 controllerA가 정보를 조작해야하는 경우 서비스에서 더 많은 메소드를 작성할 수 있습니다. 이런 식으로 뭔가 :

module.factory('youtube', function($q) { 
    var movieListCache, 
     deferred = $q.defer(); 

    function getMovies(ignoreCache) { 
    if (ignoreCache || !movieListCache) { 
     movieListCache = $http...; 
    } 

    return movieListCache; 
    } 

    function getChangedMovies() { 
    return deferred.promise; 
    } 

    function setChangedMovies(movies) { 
    deferred.resolve(movies); 
    } 

    return { 
    get: getMovies, 
    getChanged: getChangedMovies, 
    setChanged: setChangedMovies 
    }; 
}); 

당신이 $q이 무엇인지 알 수없는 경우, take a look at the docs. 비동기 작업을 처리하기 위해 필수입니다. 컨트롤러가 아버지 인 경우

  1. 당신은 $rootScope
  2. 에 동영상을 저장할 수 있고 아들이 사용할 수있는 서로 컨트롤러를 검색 할 필요 어쨌든

    도이 작업을 달성하는 몇 가지 다른 방법이 있습니다

IMHO, # 1은 일반적인 해결책입니다. 다른 옵션이없는 경우에만 사용하겠습니다. 그리고 # 2는 다른 컨트롤러의 존재를 설정하거나 알려주는 것과 같이 컨트롤러 사이에서 통신해야하는 본질적 요구가있는 경우에 유용합니다. example here이 있습니다.

당신이하고 싶은 것은 stateful 싱글 톤 정보를 공유하는 것입니다; 따라서 서비스는 갈 길이 멀다.

+0

나는 공식 문서를 읽고 공장()이 있습니다. factory() 사용에 대한 간단한 설명을 할 수 있습니까? 감사합니다. – vzhen

+0

그들은 모두 모듈에 서비스를 제공합니다. 차이점은 그 수준에있다. 공급자가 가장 정교하고 심지어 장식을 허용하는 반면 서비스는 가장 직접적인 것입니다. 좋은 설명과 예가 있습니다. [https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/b8hdPskxZXsJ], [여기] (https://groups.google.com/d/msg)/angular/56sdORWEoqg/-TgFGhm4NYAJ), [here] (http://stackoverflow.com/a/13763886/179138) 및 [여기] (http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/)를 참조하십시오. 아직도 이해가 안되면 저에게 전화해서 이야기 해 드리겠습니다. 내 코드가 수정되었습니다. –

+0

안녕하세요, 저는 서비스를 만드는 것을 이해했습니다. 하지만 내 문제는 컨트롤러 간의 연결에 대한 것이 아니라고 생각합니다. 지금 채팅 하시겠습니까? btw, 어떻게 stackoverflow 채팅? – vzhen

관련 문제