데이터 테이블에 포함 된 관찰 가능 어레이에 요소를 프로그래밍 방식으로 추가하는 데 문제가 있습니다.Knockout.js 배열에 새 항목 추가
테이블의 각 행에는 영향을 미치고 싶은 다른 배열이 있습니다.
<div class='liveExample'>
<h2>Cases</h2>
<div id='contactsList'>
<table class='contactsEditor'>
<tr>
<th>Case Number</th>
<th>Stage</th>
<th>Users</th>
<th>Ids</th>
</tr>
<tbody data-bind="foreach: appearances ">
<tr>
<td>
<input data-bind='value: caseNumber' />
</td>
<td><input data-bind='value: caseStage' /></td>
<td>
<ul data-bind="foreach: subjects">
<li style="list-style-type:none;"><label data-bind="text: Name"/></li>
</ul>
</td>
<td>
<table>
<tbody data-bind="foreach: ids">
<tr>
<td><input data-bind='value: $data' /></td>
<td><a href='#' data-bind='click: $root.removeId'>Delete</a></td>
</tr>
</tbody>
</table>
<a href='#' data-bind='click: $root.addId'>Add number</a>
</td>
</tr>
</tbody>
</table>
</div>
<p>
<button data-bind='click: save, enable:appearances().length > 0'>Save to JSON</button>
</p>
<textarea data-bind='value: lastSavedJson' rows='5' cols='60' disabled='disabled'> </textarea>
데이터와 자바 스크립트는 다음과 같습니다 :
HTML은 다음과 같습니다
enter code here
var initialData = [{
"Number": "12000009",
"Stage": "Inital",
"Subjects": [{
"Name": "Andrew McAdam"},
{
"Name": "Patrick Brown"}],
"Ids": [1]},
{
"Number": "12000010",
"Stage": "Inital",
"Subjects": [{
"Name": "John Smith"}],
"Ids": [2, 3]},
{
"Number": "12000011",
"Stage": "Inital",
"Subjects": [{
"Name": "James Bonner"}],
"Ids": [4]},
{
"Number": "12000012",
"Stage": "Processed",
"Subjects": [{
"Name": "Henrik Dalgleish"}],
"Ids": [5]}]
var AppearancesModel = function(appearances) {
var self = this;
self.appearances = ko.observableArray(ko.utils.arrayMap(appearances, function(appearance) {
return {
caseNumber: appearance.Number,
caseStage: appearance.Stage,
subjects: ko.observableArray(appearance.Subjects),
ids: ko.observableArray(appearance.Ids)
};
}));
self.addId = function(appearance) {
appearance.ids.push("");
};
self.removeId = function(id) {
$.each(self.appearances(), function() {
this.ids.remove(id)
})
};
self.save = function() {
self.lastSavedJson(JSON.stringify(ko.toJS(self.appearances), null, 2));
};
self.lastSavedJson = ko.observable("")
}
ko.applyBindings(new AppearancesModel(initialData));
내가 가진 문제는 그가 추가 버튼을 클릭 한 후 배열에 값을 입력하면 빈 문자열 (새 배열 요소를 만들 때 값)이됩니다.
나는 값이 있기 전에 배열에 새 항목을 추가한다고 생각하지만 새 값에 바인딩 될 것이라고 생각 했으므로 Save 함수를 실행하면 새로운 값이 반영됩니다. .
위의 JsFiddle는 http://jsfiddle.net/amcgoldrick/3h9GZ/
감사
앤디
@ Mark-Robinson의 조언에 따라 원래 ID를 매핑하기 위해 다음을 추가했습니다. ko.observableArray (ko.utils.arrayMap (appearance.Ids, function (id) {return ko.observable (id) }))'그리고 원래의 id가 표시됩니다. 지금 가지고있는 문제는 'appearance.ids.push ({id : ko.observable (""}));' id 속성이있는 객체를 정수 배열에 추가합니다. – AndyMcG