Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度控制器中的范围值错误_Javascript_Angularjs_Angularjs Factory - Fatal编程技术网

Javascript 角度控制器中的范围值错误

Javascript 角度控制器中的范围值错误,javascript,angularjs,angularjs-factory,Javascript,Angularjs,Angularjs Factory,我是angular 1的新手,我的代码有问题: var app = angular.module("Football", []); app.factory("competitions", ['$http', function($http) { return $http.get("json/competitions.json") .success(function(response) { var data = { response: response,

我是angular 1的新手,我的代码有问题:

var app = angular.module("Football", []);

app.factory("competitions", ['$http', function($http) {
  return $http.get("json/competitions.json")
  .success(function(response) {

    var data = {
      response: response,
      teams: []
    };

    for (var i = 0; i < response.length; i++) {

      $http.get("json/teams.json")
      .success(function(response2) {
        data.teams.push(response2);
        return data
      })
      .error(function(err) {
        return err;
      });
    }

  })
  .error(function(err) {
    return err;
  });
}]);


app.controller('MainController', ['$scope', "competitions", function($scope, competitions) {
  competitions.success(function(data) {
    $scope.competitions = data;
  });
}]);
var-app=angular.module(“Football”,[]);
app.factory(“竞赛”、['$http',函数($http){
返回$http.get(“json/competitions.json”)
.成功(功能(响应){
风险值数据={
答复:答复,,
团队:[]
};
对于(变量i=0;i
我想将数据从competitions工厂传递到MainController中的$scope.competitions。在for循环的最后一次迭代之后,数据变量应该传递给控制器。我知道这段代码是错误的,因为它只将响应传递给控制器,但我不知道如何修复它。有人能帮我吗?

试试这个

    var app = angular.module("Football", []);

app.factory("competitions", ['$http', '$q', function ($http, $q) {
  function getCompetitions(){
    return $http.get('json/competitions.json');
  }
  return {
    get: function(){
      var mainTask = $q.defer();
      getCompetitions().then(function(response){
        var compData = {
          competitions: response.data,
          teams:[]
        }
        var tasks = [];
        for(var i=0;i<compData.competitions.length;i++){
          tasks.push($http.get("json/teams.json"));
        }
        $q.all(tasks).then(function(responses){
          for(var j = 0;j<responses.length;j++){
            compData.teams.push(responses[i]);
          }
          mainTask.resolve(compData);
        }).catch(function(error){
          mainTask.reject(error);
        })
      }).catch(function(error){
        mainTask.reject(error);
      }) 
      return mainTask.promise;
    }
  }
}]);


app.controller('MainController', ['$scope', "competitions", function ($scope, competitions) {
  competitions.get().then(function(data){
    $scope.competitions = data;
  }).catch(function(error){
    //catch error here
  })
}]);
var-app=angular.module(“Football”,[]);
app.factory(“竞赛”、['$http','$q',函数($http,$q){
函数{
返回$http.get('json/competitions.json');
}
返回{
get:function(){
var mainTask=$q.defer();
getCompetitions().then(函数(响应){
var compData={
竞赛:响应、数据、,
团队:[]
}
var任务=[];
对于(var i=0;i试试这个

    var app = angular.module("Football", []);

app.factory("competitions", ['$http', '$q', function ($http, $q) {
  function getCompetitions(){
    return $http.get('json/competitions.json');
  }
  return {
    get: function(){
      var mainTask = $q.defer();
      getCompetitions().then(function(response){
        var compData = {
          competitions: response.data,
          teams:[]
        }
        var tasks = [];
        for(var i=0;i<compData.competitions.length;i++){
          tasks.push($http.get("json/teams.json"));
        }
        $q.all(tasks).then(function(responses){
          for(var j = 0;j<responses.length;j++){
            compData.teams.push(responses[i]);
          }
          mainTask.resolve(compData);
        }).catch(function(error){
          mainTask.reject(error);
        })
      }).catch(function(error){
        mainTask.reject(error);
      }) 
      return mainTask.promise;
    }
  }
}]);


app.controller('MainController', ['$scope', "competitions", function ($scope, competitions) {
  competitions.get().then(function(data){
    $scope.competitions = data;
  }).catch(function(error){
    //catch error here
  })
}]);
var-app=angular.module(“Football”,[]);
app.factory(“竞赛”、['$http','$q',函数($http,$q){
函数{
返回$http.get('json/competitions.json');
}
返回{
get:function(){
var mainTask=$q.defer();
getCompetitions().then(函数(响应){
var compData={
竞赛:响应、数据、,
团队:[]
}
var任务=[];

对于(var i=0;i您在这里做了一些错误的事情

  • 不再使用
    .success()
    .error()
    函数。请改用
    .then()

  • .success()
    函数有四个参数。第一个参数是返回的数据,因此
    response
    是实际数据,而不是整个响应。如果使用
    .then()
    ,则会返回响应,您可以从中提取数据

  • 使用
    $q
    库返回您自己的承诺,而不是从工厂返回数据。您可以在控制器中提取数据,这是您应该做的

  • 不要直接运行
    响应
    的循环,因为你永远不知道它是否是数组。如果它是实际响应,它将是实际数据的包装器

  • teams.json
    promise返回的
    数据和
    err
    到哪里去了?我猜那部分是空的

  • 与代码相比,承诺需要花费亿万年才能解决,因此我建议您不要从工厂调用
    teams.json
    ,而是从控制器调用。也就是说,在您的作用域中的
    ng repeat
    中替换一个虚拟,然后当此数据返回时,将实际数据替换为虚拟


  • 你在这里做错了几件事

  • 不再使用
    .success()
    .error()
    函数。请改用
    .then()

  • .success()
    函数有四个参数。第一个参数是返回的数据,因此
    response
    是实际数据,而不是整个响应。如果使用
    .then()
    ,则会返回响应,您可以从中提取数据

  • 使用
    $q
    库返回您自己的承诺,而不是从工厂返回数据。您可以在控制器中提取数据,这是您应该做的

  • 不要直接运行
    响应
    的循环,因为你永远不知道它是否是数组。如果它是实际响应,它将是实际数据的包装器

  • teams.json
    promise返回的
    数据和
    err
    到哪里去了?我猜那部分是空的

  • 与代码相比,承诺需要花费亿万年才能解决,因此我建议您不要从工厂调用
    teams.json
    ,而是从控制器调用。也就是说,在您的作用域中的
    ng repeat
    中替换一个虚拟,然后当此数据返回时,将实际数据替换为虚拟


  • 我认为解决您的问题的办法是先向竞赛提出请求,然后将所有请求分组,然后用
    $q.all
    解决。 检查以下jsbin:


    PS:请注意,我没有收到确切的http请求,我只是用返回虚拟数据的正常承诺来代替。

    我认为您的案例的解决方案是首先向竞赛提出请求,然后将所有请求分组,然后使用
    $q.all
    解决。 检查以下jsbin:


    PS:请注意,我没有收到确切的http请求,我只是用返回虚拟数据的正常承诺来替换。

    谢谢您的帮助,但没有帮助,结果仍然是一样的-我收到的唯一数据只是来自competitions.json的数据。我想,在第一次返回后,代码并不关心success函数中的内容(毕竟是异步请求),那么也许应该考虑其他方法?或者这是不可能的?@Michal,请查看我的更新答案。如果没有帮助,请创建plunkr或JSFIDLE,我将对其进行编辑。我将您以前的答案和@cst1992结合起来,现在它可以工作了,非常感谢!感谢您的帮助,但没有帮助,结果仍然是一样的-我收到的唯一数据这只是比赛的结果吗