Javascript 角度控制器中的范围值错误
我是angular 1的新手,我的代码有问题: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,
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结合起来,现在它可以工作了,非常感谢!感谢您的帮助,但没有帮助,结果仍然是一样的-我收到的唯一数据这只是比赛的结果吗