Javascript 迭代内部的Angularjs更新范围
在下面的代码中,我尝试获取每个问题的子问题列表并在视图中显示它们,但我在更新每个问题的子问题时遇到问题,它不会更新,所以我为所有问题获取相同的子问题列表 如何显示每个问题并列出其下的所有子问题Javascript 迭代内部的Angularjs更新范围,javascript,angularjs,angularjs-scope,angularjs-digest,Javascript,Angularjs,Angularjs Scope,Angularjs Digest,在下面的代码中,我尝试获取每个问题的子问题列表并在视图中显示它们,但我在更新每个问题的子问题时遇到问题,它不会更新,所以我为所有问题获取相同的子问题列表 如何显示每个问题并列出其下的所有子问题 function loadAllQuestionGroup () { Questiongroup.query({}).$promise.then(function(group){ vm.questiongroups = group; for(var i=0;i&
function loadAllQuestionGroup () {
Questiongroup.query({}).$promise.then(function(group){
vm.questiongroups = group;
for(var i=0;i<group.length;i++){
var grouptitle=group[i].title
Question.questionsByQuestionGroup({id:group[i].id}).$promise.then(function(question){
vm.question = question;
for(var j=0;j<question.length;j++){
Subquestion.subquestionsByQuestion({id:question[j].id}).$promise.then(function(subquestion){
vm.subquestions=subquestion;
});
}
});
}
});
}
<div ng-repeat="question in vm.question">
{{question.name}}
<div ng-repeat="subquestion in vm.subquestions">
{{subquestion.name}}
</div>
</div>
函数loadAllQuestionGroup(){
Questiongroup.query({})。$PROMITE.then(函数(组){
vm.questiongroups=组;
对于(var i=0;i来说,这似乎不是与角度范围相关的问题,而是您遇到问题的纯javascript范围。如果您在循环中进行异步调用,则每次都会收到最后一个元素。要修复它,您应该在循环中使用匿名函数包装承诺
检查这个经典示例(您可以认为setTimeout函数相当于您的问题.questionsByQuestionGroup({id:group[i].id})。$promise
,它们都是异步函数)
//这与您的情况相当
//在本例中,它将每次返回最后一个元素,在本例中为5
对于(变量i=0;i<5;i++){
setTimeout(函数(){
控制台日志(i)
});
}
//结果:5
//这就是重构的方法
//为async创建一个包装器,它将根据需要工作
对于(var j=0;j<5;j++){
(功能(索引){
setTimeout(函数(){
console.log(索引)
});
})(j) );
}
//结果:0 1 2 3 4
看起来这不是与角度作用域相关的问题,而是您遇到问题的纯javascript作用域。如果您在循环中进行异步调用,则每次都会收到最后一个元素。若要解决此问题,应在循环中使用匿名函数包装承诺
检查这个经典示例(您可以认为setTimeout函数相当于您的问题.questionsByQuestionGroup({id:group[i].id})。$promise
,它们都是异步函数)
//这与您的情况相当
//在本例中,它将每次返回最后一个元素,在本例中为5
对于(变量i=0;i<5;i++){
setTimeout(函数(){
控制台日志(i)
});
}
//结果:5
//这就是重构的方法
//为async创建一个包装器,它将根据需要工作
对于(var j=0;j<5;j++){
(功能(索引){
setTimeout(函数(){
console.log(索引)
});
})(j) );
}
//结果:0 1 2 3 4
需要将单个问题推送到问题列表中。为每个单个问题创建子问题列表。需要将单个子问题推送到各自的列表中
function loadAllQuestionGroup () {
Questiongroup.query({}).$promise.then(function(group){
vm.questiongroups = group;
//Initialize question list
vm.questionList = [];
for (var i=0;i<group.length;i++){
var grouptitle=group[i].title;
Question
.questionsByQuestionGroup({id:group[i].id})
.$promise
.then(function(question){
//Push question to list
vm.questionList.push(question);
for (var j=0;j<question.length;j++) {
//Initialize subquestion list
question.subquestionList = [];
Subquestion
.subquestionsByQuestion({id:question[j].id})
.$promise
.then(function(subquestion){
//Push subquestion to list
question.subquestionList.push(subquestion);
})
;
};
})
;
}
});
}
请注意,子问题列表
属性已添加到问题列表
中的每个
问题,需要将单个问题推送到问题列表。为每个单个问题创建子问题列表。需要推送单个子问题d到各自的列表中
function loadAllQuestionGroup () {
Questiongroup.query({}).$promise.then(function(group){
vm.questiongroups = group;
//Initialize question list
vm.questionList = [];
for (var i=0;i<group.length;i++){
var grouptitle=group[i].title;
Question
.questionsByQuestionGroup({id:group[i].id})
.$promise
.then(function(question){
//Push question to list
vm.questionList.push(question);
for (var j=0;j<question.length;j++) {
//Initialize subquestion list
question.subquestionList = [];
Subquestion
.subquestionsByQuestion({id:question[j].id})
.$promise
.then(function(subquestion){
//Push subquestion to list
question.subquestionList.push(subquestion);
})
;
};
})
;
}
});
}
请注意,
子问题列表
属性被添加到问题列表
中的每个问题中。请尝试使用$scope。$apply()更新子问题后。我已尝试,但我得到空数据get$digest已在进行中。您可以提供plunker或JSFIDLE吗?请使用$scope进行尝试。$apply()在更新子问题之后。我已经尝试了,但是我得到了空数据。get$digest已经在进行中。您可以提供plunker或JSFIDLE吗?我提供了,索引打印了0,1,2,3,但范围仍然没有update@Ali-Alrabi还有一件事我注意到了,您正在将子问题分配给数组:vm.subquestions=subquestion;
如果您想将不同的子问题分配给数组ems,您应该推送它,而不是分配我所做的和索引打印0,1,2,3,但范围仍然没有update@Ali-Alrabi还有一件事我注意到了,您正在将子问题分配给数组:vm.subquestions=subquestion;
如果您想拥有不同项目的数组,您应该将其推送到not assign