2014-09-26 8 views
1

나는 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> 

답변

1

ko.toJS()observableArray의 JS 일반 사본이 생성됩니다. 해당 관찰 가능 어레이 내에 래핑 된 원본 배열을 사용해야합니다.

ko.utils.arrayForEach(LineItemFields(), function (item) { 
    item.LineItemValues.push({ "FieldValue": "0", "configseqid": 0, "FieldID": 0, 
           "isVisible": true, "isUpdatable": true }); 
}); 
+0

여전히 아무것도 업데이트하지 않습니다. ko.toJS()를 제거하려고 시도하면 item.LineItemValues의 요소가 푸시되지만 UI의 변경 사항은 반영되지 않습니다. LineItemFields()는 관찰 할 수 있으므로 그렇게해야합니다! –

+0

'LineItemFields' 요소의 속성 ('LineItemValues') 자체를'LineItemFields'가 아닌 속성으로 변경하면 알림이 없습니다. observableArray는 배열에 추가/제거하는 요소 만 감시합니다. 변경 사항을 보려면'item.LineItemValues'를 observableArray로 변환해야합니다. – manji

+0

이 관찰 가능 배열 (LineItemFields)에 바인딩 된 템플릿을 업데이트했습니다. –