AngularJS将数据从控制器传递到另一个控制器

我做了什么。 我用带有特定指令的controllerA中的json检索youtube api中的视频列表。 json包含视频列表和视频本身的详细信息。

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

所以我的问题是如何将数据从控制器A传递给控制器​​B.

注 - $ controller服务在controllerA中使用


这是从AngularJS开始的常见疑问之一。 根据你的要求,我相信你最好的选择是创建一个服务,检索电影列表,然后在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是什么,请查看文档。 这是处理异步操作所必需的。

无论如何,还有其他一些方法可以完成这项任务:

  • 您可以将视频保存在$rootScope
  • 如果控制器是父亲和儿子,则可以使用require来检索每个其他控制器
  • 恕我直言,#1是一个通用的解决方案; 只有在没有其他选择的情况下,我才会使用它。 如果你有这些控制器之间的内在通信需求,比如配置或者让他们知道对方的存在,那么#2很有用。 这里有一个例子。

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

    链接地址: http://www.djcxy.com/p/77821.html

    上一篇: AngularJS pass data from controller to another controller

    下一篇: different ways to create controllers and services, why?