2013-04-02 177 views
5

我做了什么。 我使用特定的指令从控制器A中的json中检索youtube api中的视频列表。 json包含视频列表和视频本身的详细信息。AngularJS将数据从控制器传递到另一个控制器

我想要做什么。 点击视频时,我希望视频的详细信息以其他控制器B的另一个ng视图显示,并使用之前请求的json数据。

所以我的问题是 如何从controllerA数据传递到controllerB

- 与AngularJS启动时的$ HTTP服务使用controllerA

+0

您需要创建一个服务:检查这篇文章。 http://stackoverflow.com/a/12009408/2104976 – callmekatootie

回答

15

这是常见的疑虑之一。根据您的要求,我相信您的最佳选择是create a service,它会检索电影列表,然后在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() { 
    }); 
}]); 

如果您需要controllerA在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 
    }; 
}); 

如果你不知道什么是$qtake a look at the docs。这是处理异步操作所必需的。

总之,有太多完成此任务的其他一些方法:

  1. 你可以在$rootScope
  2. 保存影片如果控制器是父亲和儿子,你可以使用需要来获取对方控制器

恕我直言,#1是一个通用的解决方案;只有在没有其他选择的情况下,我才会使用它。如果你有这些控制器之间的内在通信需求,比如配置或者让他们知道对方的存在,那么#2很有用。有一个example here

你想要做的是共享有状态的单身信息;因此,一项服务就是要走的路。

+0

我阅读官方文档,并有一个工厂()。你可以做一个关于使用factory()而不用它的快速解释吗? 谢谢。 – vzhen

+0

他们都向服务提供模块。差异在于它的柔软程度。虽然提供商是最复杂的,甚至允许装饰,而服务是最直接的。有很好的解释和示例[这里](https://groups.google.com/forum/#!msg/angular/56sdORWEoqg/b8hdPskxZXsJ),[here](https://groups.google.com/d/msg/angular/56sdORWEoqg/-TgFGhm4NYAJ),[here](http://stackoverflow.com/a/13763886/179138)和[here](http://jsfiddle.net/pkozlowski_opensource/PxdSP/14/)。如果你仍然不明白,打电话给我聊天,我会解释你。修复了我的代码。 –

+0

嗨,我明白创建一项服务。但我认为我的问题不在于控制器之间的链接。你现在可以自由聊天吗?顺便说一句,如何在stackoverflow聊天? – vzhen

相关问题