나는 asp 응용 프로그램에 knockout.js를 사용하고 있습니다. 컨트롤러 동작에 의해 뷰에 반환 된 개체 목록이 있고 목록의 개체가 개체 목록을 가리키고 있습니다. 녹아웃을 통해 내부 목록에 새 개체를 추가 할 수 없습니다. 무엇 내가 지금까지했던 것은 : 녹아웃 -3.2.0 - 내부 목록 <object> 푸시 발행
@{
var initialData = @Html.Raw(new System.Web.Script.Serialization
.JavaScriptSerializer().Serialize(Model));
}
와 뷰 모델에
:addLineItem = function() {
ko.utils.arrayForEach(ko.toJS(LineItemFields), function (item) {
item.LineItemValues.push({"FieldValue": "0", "configseqid": 0, "FieldID": 0,
"isVisible": true, "isUpdatable": true });
});
//LineItemValues is the inner list of each object being iterated.
내가 성공적으로 스크립트 디버깅 및 시도 : 뷰 모델에
LineItemFields = ko.observableArray(@initialData);
부가 기능은 다음을 수행 새 항목을 반복되는 객체의 내부 목록으로 푸시하지만 원래 객체에는 삽입하지 않습니다. 의미 item.LineItemValues는 복사이고 LineItemFields [index] .LineItemValues가 아니라, 새로운 항목을 관찰 가능 배열에 푸시해야하는 이유는 무엇입니까?
업데이트 : 내 템플릿 바인딩 및 스크립트는 다음과 같습니다
<tr data-bind="template: {name: 'LineItemDataTemplate', foreach: LineItemFields}"> </tr>
<script id="LineItemDataTemplate" type="text/html">
<td data-bind="foreach: $data['LineItemValues']"><input type="text" data-bind="value: FieldValue, enable: $parent.isUpdatable" /></td>
</script>
여전히 아무것도 업데이트하지 않습니다. ko.toJS()를 제거하려고 시도하면 item.LineItemValues의 요소가 푸시되지만 UI의 변경 사항은 반영되지 않습니다. LineItemFields()는 관찰 할 수 있으므로 그렇게해야합니다! –
'LineItemFields' 요소의 속성 ('LineItemValues') 자체를'LineItemFields'가 아닌 속성으로 변경하면 알림이 없습니다. observableArray는 배열에 추가/제거하는 요소 만 감시합니다. 변경 사항을 보려면'item.LineItemValues'를 observableArray로 변환해야합니다. – manji
이 관찰 가능 배열 (LineItemFields)에 바인딩 된 템플릿을 업데이트했습니다. –