Javascript 热毛巾/Knockout.js-带有observableArray的HTML显示问题
我正在处理以下对象/结构:课程、子类别、子大学、类别、子类别、课程时间表 一门课程可以有一个子类别,也只能有一个子类别,但可以是多个子大学的一部分(因此CourseSchedule对象包含一门课程和一个子大学) 每个子类别有一个父类别;每个附属大学都有一所母校 我有一个courseadd视图和courseedit视图。使用courseadd视图创建课程对象后,可以在courseadd视图中添加子大学(通过CourseSchedules) 当我尝试添加子Universite时,第一个出现两次 当我添加后续子Universite时,它们会正确显示,第一个仍在复制 这是查看代码Javascript 热毛巾/Knockout.js-带有observableArray的HTML显示问题,javascript,knockout.js,single-page-application,hottowel,singlepage,Javascript,Knockout.js,Single Page Application,Hottowel,Singlepage,我正在处理以下对象/结构:课程、子类别、子大学、类别、子类别、课程时间表 一门课程可以有一个子类别,也只能有一个子类别,但可以是多个子大学的一部分(因此CourseSchedule对象包含一门课程和一个子大学) 每个子类别有一个父类别;每个附属大学都有一所母校 我有一个courseadd视图和courseedit视图。使用courseadd视图创建课程对象后,可以在courseadd视图中添加子大学(通过CourseSchedules) 当我尝试添加子Universite时,第一个出现两次
<section id="course-edit" class="view">
<h3 class="page-title" data-bind="text: title"></h3>
<div class="button-bar">
<button class="btn btn-info"
data-bind="click: goBack"><i class="icon-hand-left"></i></button>
<button class="btn btn-info"
data-bind="click: cancel, enable: canSave"><i class="icon-undo"></i> Cancel</button>
<button class="btn btn-info"
data-bind="click: save, enable: canSave"><i class="icon-save"></i> Save</button>
<button class="btn btn-danger"
data-bind="click: deleteCourse, disable: hasChanges">
<i class="icon-trash"></i> Delete
</button>
<i class="icon-asterisk" data-bind="visible: hasChanges"></i>
</div>
<div data-bind="with: course">
<div>
<label for="courseName">Name</label>
<input id="courseName" data-bind="value: courseName" placeholder="Course Name" />
</div>
<div>
<label for="category">Category</label>
<select id="category" data-bind="options: $parent.subcategories, optionsText: 'subCategoryName', value: subCategory"></select>
</div>
<div>
<label for="courseMaterialURL">Material URL</label>
<input id="courseMaterialURL" data-bind="value: courseMaterialURL" placeholder="http://" />
</div>
<div>
<label for="courseImageURL">Image URL</label>
<input id="courseImageURL" data-bind="value: courseImageURL" placeholder="http://" />
</div>
<div>
<label for="courseDescription">Description</label>
<textarea id="courseDescription" data-bind="value: courseDescription" placeholder="Course Description" rows="4"></textarea>
</div>
<div style="width:600px">
<div style="float:right">
<label for="courseUniversity"> </label>
<section id="courseScheduleNode" class="view-list" data-bind="foreach: courseSchedules" >
<article>
<div>
<span style="margin-right: 10px" data-bind="text: subUniversity().subUniversityName"></span>
<button class="btn btn-danger" data-bind="click: $root.removeSubUniversity" style="float:right"><i class="icon-remove"></i></button>
</div>
<br />
</article>
</section>
</div>
<div>
<label for="courseUniversity">Add University</label>
<select id="courseUniversity" data-bind="options: $parent.subuniversities, optionsText: 'subUniversityName', value: selectedSubUniversity, optionsCaption: ' '"></select>
<button class="btn btn-success" data-bind="click: $parent.addSubUniversity"><i class="icon-ok"></i></button>
</div>
</div>
</div>
</section>
数据库中的数据是正确的,因此这似乎是一个淘汰绑定问题。什么会导致第一个值绑定两次?下面是关键代码。如果子大学隐藏删除的行。与附属大学解决重复问题。调用subuniversity().subuniversityname导致此问题。()中断了绑定项和显示项之间的关系。调用save时,id被更改,导致knockout认为它是一个新项,并再次绑定它,导致显示的集合与数据绑定集合不同步
<!-- ko if: subUniversity -->
<article>
<div>
<!-- ko with: subUniversity -->
<span style="margin-right: 10px" data-bind="text: subUniversityName"></span>
<!-- /ko -->
<button class="btn btn-danger" data-bind="click: $root.removeSubUniversity" style="float:right"><i class="icon-remove"></i></button>
</div>
<br />
</article>
<!-- /ko -->
<!-- ko if: subUniversity -->
<article>
<div>
<!-- ko with: subUniversity -->
<span style="margin-right: 10px" data-bind="text: subUniversityName"></span>
<!-- /ko -->
<button class="btn btn-danger" data-bind="click: $root.removeSubUniversity" style="float:right"><i class="icon-remove"></i></button>
</div>
<br />
</article>
<!-- /ko -->
var addSubUniversity = function (selectedCourse) {
if (selectedCourse) {
var cs = datacontext.createCourseSchedule();
cs.courseId(selectedCourse.id());
cs.subUniversityId(selectedCourse.selectedSubUniversity().id());
selectedCourse.courseSchedules.push(cs);
}
};
var removeSubUniversity = function (selectedCourseSchedule) {
if (selectedCourseSchedule) {
if (selectedCourseSchedule.entityAspect.entityState.isAdded()) {
selectedCourseSchedule.entityAspect.rejectChanges();
course().courseSchedules.remove(selectedCourseSchedule);
}
else
{
selectedCourseSchedule.entityAspect.setDeleted();
}
}
};