在我的控制器中,我通过问卷调查问题:
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);
}
答案 0 :(得分:1)
原因是因为你在循环中创建了一个带闭包的函数,这会导致这种不直观的行为。阅读:Creating closures in loops: A common mistake
最终发生的事情是内部函数捕获循环中的最后一个q
,为此(由于某种原因,可能未在此处的代码中显示),q.optionChanged
为undefined
相反,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();
}
这让我过去很痛苦。请务必仔细阅读文档: