【发布时间】:2014-02-27 06:32:48
【问题描述】:
我试图弄清楚如何根据 observableArray() 中是否存在特定项目来更改表格中按钮的可见性。
例如,我有一个学生/课程名册,其中包含所有学生的列表和每门课程的注册学生列表。如果学生出现在当前的 EnrolledStudents observableArray 中,我想让“添加”按钮在所有学生列表旁边变得不可见。在我看来,我有:
<tbody data-bind="foreach: AllStudents">
<tr>
<td><button data-bind="click: $parent.add, visible: $parent.isEnrolled">Add</button></td>
<td data-bind="text: StudentId"></td>
<td data-bind="text: FirstName"></td>
<td data-bind="text: LastName"></td>
</tr>
</tbody>
我遍历 AllStudents 并显示信息以及“添加”按钮。但是,我有一个 isEnrolled 函数来确定特定学生是否注册了当前选择的课程。这是我的功能:
this.isEnrolled = ko.computed(function (item) {
var index = $.inArray(item, self.EnrolledStudents);
if (index > -1) {
return true;
}
return false;
});
问题是,ko.computed() 没有按预期将关联的对象传递给这个函数,这使得item = undefined... 我需要做什么才能使这个函数对每个学生都有效桌子?
这是我的整个 ViewModel.. 没有 jsFiddle 会导致 ajax 调用不起作用。
function AppViewModel() {
this.AllStudents = ko.observableArray();
this.AllCourses = ko.observableArray();
this.EnrolledStudents = ko.observableArray();
this.CurrentCourse = ko.observable("1");
var self = this;
this.add = function (item) {
$.post('/api/Course/AddStudentToCourse?courseId='+self.CurrentCourse()+'&studentId='+item.Id, function (data) {
alert("Success");
console.log(data);
self.EnrolledStudents.push(data);
});
}
this.remove = function (item) {
$.ajax({
url: '/api/Course/DeleteStudentFromCourse?courseId='+self.CurrentCourse()+'&studentId='+item.Id,
type: 'DELETE',
success: function (data) {
if (data == true) {
self.EnrolledStudents.destroy(item);
}
}
});
}
this.isEnrolled = ko.computed(function () {
var index = $.inArray(item, self.EnrolledStudents);
if (index > -1) {
return true;
}
return false;
}, this);
$.get('/api/Course/AllStudents', this.AllStudents);
$.get('/api/Course/AllCourses', this.AllCourses);
$('select').change(function () {
self.CurrentCourse($('select option:selected').val());
if (self.CurrentCourse() != "") {
$.get('/api/Course/StudentsByCourse', { id: self.CurrentCourse() }, self.EnrolledStudents);
}
});
}
ko.applyBindings(new AppViewModel());
【问题讨论】:
-
能否请您展示您的整个视图模型或制作小提琴?
-
好的,我更新了帖子
-
你是在检查学生是否被录取还是其他情况是否属实?
标签: knockout.js