如何从ng-repeat中的ng-option中获取选定的值

时间:2015-09-17 16:06:16

标签: 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;
        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
}

在我看来,我也循环着问题:

<div class="card" ng-repeat="q in s.Questions">
    <div class="item item-divider">{{q.Text}}</div>
    <div class="item" ng-if="q.dropdown">
        <select ng-model="q.selectedOption"
                ng-options="va.AnswerID as va.Text for va in q.ValidAnswers"
                ng-change="q.optionChanged()">
            <option>--Select--</option>
        </select>
    </div>
</div>

在浏览器中查看时,会显示正确的selectedOption,并调用q.optionChanged()功能。但在该函数中,q.selectedOption未定义

修改 此功能似乎有效。但我无法解释原因!

q.optionChanged = function () {
    var debug = q.selectedOption;
    var answerid = this.selectedOption;
    aq.toggleAnswer(answerid);
}

2 个答案:

答案 0 :(得分:1)

原因是因为你在循环中创建了一个带闭包的函数,这会导致这种不直观的行为。阅读:Creating closures in loops: A common mistake

最终发生的事情是内部函数捕获循环中的最后一个q,为此(由于某种原因,可能未在此处的代码中显示),q.optionChangedundefined

相反,this绑定到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);
  }
}

如果您只需要引用正确的this,那么使用q就可以了,但您还需要aq,因此需要函数生成器。

答案 1 :(得分:-1)

为了从控制器中自动选择选项,ng-model 必须包含对数组项的引用。从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" 整个项目。你需要重构你的理解表达。

public async Task<ActionResult> Get(string path)
{
     StaticImage image = await _images.UseRepositoryAsync(repo => repo.ReadAsync(path));
     return image != null ? new FileStreamResult(image.Stream, "image/jpeg") : (ActionResult)HttpNotFound();
}

这让我过去很痛苦。请务必仔细阅读文档:

https://docs.angularjs.org/api/ng/directive/ngOptions