2013-04-02 4 views
5

Что я сделал. Я извлекаю список видео с youtube api с json в контроллере A с конкретной директивой. Json содержит список видео и самой информации о видео.AngularJS передает данные от контроллера другому контроллеру

Что я хочу делать. Когда вы нажимаете на видео, я хочу, чтобы информация о видео отображалась в другом ng-представлении с другим контроллеромB с использованием данных json, которые я запрашивал ранее.

Так что мой вопрос Как передать данные из controllerA в controllerB

Примечание - $ службы HTTP является использование в controllerA

+0

Вам необходимо создать сервис: Отметьте этот пост. http://stackoverflow.com/a/12009408/2104976 – callmekatootie

ответ

15

Это одна из наиболее распространенных сомнений при запуске с AngularJS. По вашему требованию, я считаю, что ваш лучший вариант - create a service, который извлекает список фильмов, а затем использует эту услугу как в controllerA, так и в controllerB.

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

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

    return movieListCache; 
    } 

    return { 
    get: getMovies 
    }; 
}); 

Затем вы просто вводите эту услугу в оба контроллера.

Если вам нужен контроллерA для управления информацией, прежде чем использовать ее в B, вы можете создать больше методов в службе. Что-то вроде этого:

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.

Что вы хотите сделать, это обмениваться информацией об одноточечной информации с состоянием; поэтому услуга - это путь.

+0

Я прочитал официальную документацию, и есть завод(). Можете ли вы быстро объяснить использование фабрики() и без нее? Спасибо. – vzhen

+0

Все они предоставляют услуги модулю. Разница заключается в уровне разрешения. В то время как провайдер является самым сложным, даже разрешая украшение, а обслуживание является самым прямым. Существуют хорошие пояснения и примеры [здесь] (https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/b8hdPskxZXsJ), [здесь] (https://groups.google.com/d/msg/angular/56sdORWEoqg/-TgFGhm4NYAJ), [здесь] (http://stackoverflow.com/a/13763886/179138) и [здесь] (http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/). Если вы все еще не понимаете, позвоните мне в чат, и я объясню вам. Исправлен мой код. –

+0

Привет, я понял, что создаю услугу. Но я думаю, что моя проблема заключается не в связи между контроллером. Вы можете пообщаться сейчас? Кстати, как пообщаться в stackoverflow? – vzhen

Смежные вопросы