我试图通过构建一个简单的成绩簿应用程序来学习使用Knockout进行Web开发。它还处于早期开发阶段,但我已经在每个<td>
中获取<tr>
以匹配<th>
中的列。元素。到目前为止,我没有添加行或标题列的问题,但是当我尝试更新每一行,使其具有与表标题相同的数字或列时,我会得到奇怪的行为。
请在此处查看示例:http://jsbin.com/fehoq/2/edit
看起来我正在获得新的<td>
,但我的<input>
元素缺失,空字符串值也是如此!
注意:我使用typescript生成了javascript。我不认为这应该是一个问题。
从我的模特:
addScore = function(score){
this.scores.push(score);
}
从我的视图模型:
updateRows = function(){
for(var i=1;i<this.students.length;i++){
while(this.students[i].scores.length<this.assignments.length){
this.students[i].addScore("");
}
}
}
请注意,作业是一个可观察的数组&#34; work&#34;对象和学生是一组可观察的学生对象。 &#34;比分&#34;也是属于每个学生对象的可观察数组。
看起来我的updateRows()方法完全没有任何成就。我不知道在哪里打电话。
答案 0 :(得分:1)
foreach应该是父元素,因为在您的情况下,您不应该使用注释表示法:http://jsbin.com/wideyeku/2/edit?html,js,output
<thead>
<tr>
<th>Name</th>
<!-- ko foreach: assignments -->
<th><input data-bind="value: workName"/></th>
<!-- /ko -->
</tr>
</thead>
<强>更新强>: http://jsbin.com/wideyeku/4/edit?js,console,output 我发现你的代码中有一些逻辑错误:
首先,this
在javascript中是可变的,因此请在模型中保留对它的引用:
function StudentsViewModel() {
var self = this;
然后更正您的更新行功能:
this.updateRows = function () {
ko.utils.arrayForEach(this.students(), function(student){
while(student.scores().length < self.assignments().length){
student.scores.push("");
}
})
};
永远不要忘记observableArrays是函数,需要调用。