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);
  }
}