【问题标题】:Can I get Angular variable of one controller in other (variable by $http)我可以在另一个控制器中获取一个控制器的 Angular 变量吗(通过 $http 变量)
【发布时间】:2016-01-22 11:56:44
【问题描述】:

我是 Angularjs 的新手,学习了很多。但我坚持了一点。谷歌没有帮助我。我有一个控制器,我在 $scope.results 中有数据

app.controller('manage_categories', function($scope, $http, $filter, $window) {
     $scope.results = [];
     $http({
        url: base_url + 'employee/fetchData?table=results',
        method: "POST",
    }).success(function(data) {
        $scope.results = data;
    }); 
})

现在我想在其他没有任何其他$http 呼叫的情况下访问相同的内容。我已经打完了另一个电话,但我不想要这个。因为我在许多其他控制器中需要这个。像这样的东西

app.controller('manage_users', function($scope, $http, $filter, $window,results) {
     $scope.results = results;
     //~ $http({
        //~ url: base_url + 'employee/fetchData?table=results',
        //~ method: "POST",
    //~ }).success(function(data) {
        //~ $scope.results = data;
    //~ });
})

或任何其他方法。谢谢。

更新

我试过了

var myApp = angular.module('myApp',[]);
myApp.factory('results', function() {
  return {
      name : [{id:21,name:'this is test'}]
  };
});

app.controller('manage_users', function($scope, $http, $filter, $window,results) {
         $scope.results = results;
    })

这工作正常。但不适用于 $http 调用。

var myApp = angular.module('myApp',[]);
    myApp.factory('results', function($scope,$http) {
       $scope.results=[];
       $http({
            url: base_url + 'employee/fetchData?table=results',
            method: "POST",
        }).success(function(data) {
            $scope.results = data;
        }); 
      return {
          name : results
      };
    });

更新 2

回答完后我会这样写

var canapp = angular.module('canApp', ["ngRoute", "angularFileUpload"]);
canapp.service('ResultsFactory', ['$http', function($http) {
   // http call here
   var url=base_url + 'employee/fetchData?table=results';
   $http.post(url,data).success(function(data){
               this.results = data;
          });

}])

这样调用

canapp.controller('get_candidates', function($scope, $http, $filter, $timeout, $window, ResultsFactory) {
$scope.check=ResultsFactory.results;
});

但它没有在模板中设置值

【问题讨论】:

  • 查看 $rootScope.broadcast,或者创建一个服务来共享数据
  • 您需要服务或工厂来跨控制器共享数据。见Angular Service
  • 在 manage_users 控制器上你必须使用 $promise try: results.name().then(function(data){$scope.results = data;});
  • 您需要创建一个服务,在该服务中调用$http,在对象$scope.results 中收集数据,然后,您可以将服务注入任何控制器并访问@987654332 @
  • @PierreEmmanuelLallemant 你能解释一下我该怎么做吗?

标签: javascript angularjs


【解决方案1】:

使用$broadcast 在控制器之间共享数据。您的代码将如下所示

app.controller('manage_categories', function($scope, $http, $filter, $window, $rootScope) {
     $scope.results = [];
     $http({
        url: base_url + 'employee/fetchData?table=results',
        method: "POST",
    }).success(function(data) {
        $scope.results = data;
        $rootScope.$broadcast("results",data);
    }); 
});

app.controller('otherCtrlr', function($scope, $rootScope) {
         $rootScope.$on("results", function(event, data){
            $scope.results = data;
         });
    });

但是在控制器中使用服务调用并不是最好的方法。创建一个工厂并创建一个方法来调用您的服务。 您需要从控制器调用此方法。但是为了避免两次服务调用,你肯定需要使用广播/发射(取决于数据传输是来自父母还是孩子)

【讨论】:

  • $rootScope 未定义 :(
  • 在第一个控制器中包含 $rootScope.. 等等我会更新它!
  • 做到了。但不设置值。
  • 你面临什么问题?
  • 你能分享文件和代码以及你到底做了什么!
【解决方案2】:

两个控制器之间有多种可能的通信方式。如果您只是 Google 在控制器 angularjs 之间共享数据,您可能会发现各种链接:

  1. Using Services to Share Data Between Controllers
  2. Sharing Data Between Controllers
  3. Share data between AngularJS controllers
  4. Passing data between controllers in Angular JS?

所以,简而言之,可能的方法是:

  1. 使用 Angular 工厂(推荐)
  2. 使用$rootScope(不推荐)
  3. 使用最顶层控制器的作用域作为根作用域

【讨论】:

    【解决方案3】:

    你可以这样做:

    app.factory('ResultsFactory', resultsFactory);
    resultsFactory.$inject = ['$http'];
    function resultsFactory = function(){
       var self = {};
       var results = null;
    
       self.getResults = function(){
           if(!results){
              $http.post(url,data).success(function(data){
                  results = data;
              });
           }else{
              return results;
           }
       }
    
       return self;
    }
    

    只有在您第一次调用 ResultsFactory.getResults() 时才会执行 $http 调用。

    【讨论】:

    • resultsFactory 未定义。
    • 我这样做了,但它没有设置值。
    【解决方案4】:

    这是一个解释如何在控制器之间共享数据的小技巧。

    https://jsfiddle.net/frishi/zxnLwz6d/10/

    (检查浏览器控制台,看看两个控制器都可以通过服务访问数据。)

    基本上服务的前提是它是一个单例,可以被你模块上注册的所有控制器使用。

    你想在服务中调用$http

    .service('myService', ['$http', function($http) {
    
     this.getData = function(){
        // Simple GET request example:
        return $http({
          method: 'GET',
          url: 'https://api.github.com/users/mralexgray/repos' // example API
        }).then(function successCallback(response) {
            return response;
        }, function errorCallback(response) {
           // return error message
        });
        }
     }])
    

    在您的控制器中:

    .controller('Controller2',['$scope','myService',function ($scope,myService) {
       $scope.foo = myService.getData();
       //resolve the promise:
       $scope.foo.then(function(data){
         console.log(data);
       })
     }
    ])
    

    【讨论】:

      【解决方案5】:

      强烈建议使用 frishi 指出的分离服务。此示例位于单个文件和模块中,只是为了使其可读。以下实现存储承诺,实际请求仅在初始调用 getFoo 时发出。其余的将从内存中的 Promise 中获得响应。

      'use strict';
      
      angular.module('foo', [])
      
      .factory('FooResource', function SessionResource($http) {
      
          var fooPromise;
      
          return {
            getFoo: function getFoo() {
              if(!fooPromise) {
                fooPromise = $http.post('employee/fetchData?table=results');
              }
              return fooPromise;
            }
          };
      })
      
      .controller('FooController', function($scope, FooResource) {
      
        FooResource.getFoo().then(function getFooSuccess(data) {
          $scope.results = data;
        });
      
      });
      

      【讨论】:

        【解决方案6】:

        我将此角代码与离子框架一起使用 可能对你有帮助..

        我的工厂是..

        angular.module('starter.services', [])
        
            .factory('Chats', function() {
              // Might use a resource here that returns a JSON array
        
              // Some fake testing data
              var chats = [{
                id: 0,
                name: 'Ben Sparrow',
                lastText: 'You on your way?',
                face: 'img/ben.png'
              }, {
                id: 1,
                name: 'Max Lynx',
                lastText: 'Hey, it\'s me',
                face: 'img/max.png'
              }, {
                id: 2,
                name: 'Adam Bradleyson',
                lastText: 'I should buy a boat',
                face: 'img/adam.jpg'
              }, {
                id: 3,
                name: 'Perry Governor',
                lastText: 'Look at my mukluks!',
                face: 'img/perry.png'
              }, {
                id: 4,
                name: 'Mike Harrington',
                lastText: 'This is wicked good ice cream.',
                face: 'img/mike.png'
              }];
        
              return {
                all: function() {
                  return chats;
                },
                remove: function(chat) {
                  chats.splice(chats.indexOf(chat), 1);
                },
                get: function(chatId) {
                  for (var i = 0; i < chats.length; i++) {
                    if (chats[i].id === parseInt(chatId)) {
                      return chats[i];
                    }
                  }
                  return null;
                }
              };
            });
        

        我在许多控制器中使用这个工厂

        .controller('ChatsCtrl', function($scope, Chats) {
          $scope.chats = Chats.all();
          $scope.remove = function(chat) {
            Chats.remove(chat);
          };
        })
        
        .controller('ChatDetailCtrl', function($scope, $stateParams, Chats) {
          $scope.chat = Chats.get($stateParams.chatId);
        })
        

        在这个代码工厂中,只点击了一次 http:// 请求,我在两个控制器上使用了响应。 希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-21
          • 1970-01-01
          • 2021-11-02
          • 1970-01-01
          • 1970-01-01
          • 2020-11-23
          • 2017-09-30
          • 2017-03-23
          相关资源
          最近更新 更多