【问题标题】:how to use factory/service for sharing information between multiple controllers in angularjs?如何使用工厂/服务在 angularjs 中的多个控制器之间共享信息?
【发布时间】:2013-07-04 13:51:53
【问题描述】:

我试图在应用程序启动时加载 JSON,并在我的所有控制器之间传播数据。 我知道这不是很难做到,但是我对我读过的所有文章/答案感到困惑,因为它们使用的语法与我不同,有人可以指导我如何做到这一点吗?

我目前正在制作控制器制作 $http.get :

myApp = angular.module("myApp", [])

myApp.controller "HomeCtrl", ($scope, $http, $routeParams) ->
 $http.get('gethome.php').success (data) ->
  $scope.home = data

但我必须在每个我想访问该数据的控制器中重复自己

【问题讨论】:

    标签: http angularjs controllers


    【解决方案1】:

    我会推荐你​​在服务中使用记忆模式并在控制器中重用服务

    请检查以下示例代码

      var app = angular.module('plunker', []);
    
              app.service('cache', function ($http,$q) {
                  var mycache={};
                  return {
                      getdata: function (key) {
                          var deferred = $q.defer();
                          if (mycache[key]) {
                              deferred.resolve(mycache[key]);
                          }
                          else {
                              $http.get('TextFile.txt').then(function (data) {
                                  mycache[key] = data.data;
                                  deferred.resolve(mycache[key]);
                              });
                          }
                          return deferred.promise;
                      }
                  }
              });
    
    
              app.controller('test', function ($scope, cache) {
                  cache.getdata('cache').then(function (data) {
                      $scope.data = data;
                  });
             });
    
               app.controller('test1', function ($scope, cache) {
                  //since data is already cached now it will server the cached data
                  cache.getdata('cache').then(function (data) {
                      $scope.data = data;
                  });
             });
    

    【讨论】:

    • Ajay,谢谢你,但你能解释一下那个代码吗?或者稍微简化一下
    • 基本上角度服务是单例实例。所以当你第一次调用服务时 mycahe 将为空然后我们进行 ajax 命中并获取数据并分配给 mycahe 。下次你调用服务 mycahe不会为空,所以它会直接返回添加到 mycache 中的结果,因此不需要进行新的 ajax 调用
    【解决方案2】:

    您可以通过以下方式访问$scope:

    angular.element(document.getElementById('YourCtrl')).scope();
    

    之后,您可以在所有控制器中初始化data。

    【讨论】:

    • 好的,但是你想访问Controller,我提出了一个解决方案;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    相关资源
    最近更新 更多