Angularjs 如何从ng repeat内的ng选项中获取选定值
在我的控制器中,我循环回答问卷中的问题:Angularjs 如何从ng repeat内的ng选项中获取选定值,angularjs,Angularjs,在我的控制器中,我循环回答问卷中的问题: for (var j = 0; j < s.Questions.length; j++) { var q = s.Questions[j]; var aq = datacontext.getAnsweredQuestion(propertySurvey.ID, q.ID); if (q.QuestionType === 'SingleAnswer') { q.dropdown = true;
for (var j = 0; j < s.Questions.length; j++) {
var q = s.Questions[j];
var aq = datacontext.getAnsweredQuestion(propertySurvey.ID, q.ID);
if (q.QuestionType === 'SingleAnswer') {
q.dropdown = true;
q.selectedOption = aq.ActualAnswers.length > 0 ?
aq.ActualAnswers[0].AnswerID : null;
q.optionChanged = function () {
var debug = q.selectedOption; //ERROR - this is undefined
aq.toggleAnswer(q.selectedOption);
}
}
//etc
}
为了从控制器中自动选择选项,ng型号必须保留对阵列项的引用。分配
q.selectedOption
来自aq.ActualAnswers
的整个项目。您需要重构您的理解表达式
// in the controller
q.selectedOption = aq.ActualAnswers.length > 0 ?
aq.ActualAnswers[0] : null;
// in the view
ng-options="va as va.Text for va in q.ValidAnswers"
这在过去给我带来了痛苦。请确保仔细阅读文档:
原因是您正在创建一个在循环中包含闭包的函数,这会导致这种不直观的行为。阅读: 最终发生的情况是,内部函数捕获循环中最后一个
q
,对于这个循环(出于某种原因,可能没有在这里的代码中显示),q.optionChanged
是未定义的
相反,此
绑定到右侧的q
,由ng change=“q.optionChanged()”
中的表达式提供
要修复此问题,请使用函数生成器为每个循环迭代创建一个函数,如下所示:
for (var j = 0; j < s.Questions.length; j++) {
var q = s.Questions[j];
var aq = datacontext.getAnsweredQuestion(...);
// ...
q.optionChanged = makeOptionChangeFn(q, aq)
// ...
}
function makeOptionChangeFn(q, aq){
return function(){
aq.toggleAnswer(q.selectedOption);
}
}
for(var j=0;j
如果您只需要引用正确的q
,而且还需要aq
,则使用此
将有效,因此需要一个函数生成器。该选项正在自动选择中。但是我无法在optionChanged
函数中获取新选择项的值ValidAnswers
和ActualAnswers
是两个独立的数组。我已经尝试了您编写的代码,我想我正在将ng模型绑定到一个ActualAnswer
,但是将选项绑定到一个ValidAnswer
,这意味着它不再自动选择。我发现,this.selectedOption
代替了q.selectedOption
似乎包含值。。。
// in the controller
q.selectedOption = aq.ActualAnswers.length > 0 ?
aq.ActualAnswers[0] : null;
// in the view
ng-options="va as va.Text for va in q.ValidAnswers"
for (var j = 0; j < s.Questions.length; j++) {
var q = s.Questions[j];
var aq = datacontext.getAnsweredQuestion(...);
// ...
q.optionChanged = makeOptionChangeFn(q, aq)
// ...
}
function makeOptionChangeFn(q, aq){
return function(){
aq.toggleAnswer(q.selectedOption);
}
}