0

녹아웃을 사용하여 접을 수있는 행이있는 테이블을 만들려고합니다. 각 "상위"행은 내 데이터 구조의 최상위 수준에 있으며 각 "하위"행은 구성원 배열의 요소입니다.중첩 된 녹아웃 템플릿을 사용하여 중첩 된 데이터 표시

서버에서 데이터를 업데이트 할 때 문제가 발생합니다. 데이터는 업데이트되지만 "부모"행의 확인란이 지워지기 때문에 DOM 객체를 대체한다고 말할 수 있습니다. 나는 데이터를 업데이트하기 위해 타이머를 사용하여이 문제를 보여줍니다 바이올린을 가지고

http://jsfiddle.net/jdlogicman/m2LWk/

내가 대신 {{each}}의 중첩 된 foreach 문을 사용하여을 수정해야한다고 읽었습니다,하지만 나는 것을 얻을 수 없다 작동하려면 위의 바이올린에서 주석 처리 된 섹션을 참조하십시오.

기존 질문에서이 문제를 해결 한 경우 어떻게 처리 할 수 ​​있습니까? 어떤 도움을 주신다면

+0

http://jsfiddle.net/unklefolk/RYqTT/

. 당신이하고 싶은 것이 이것입니까? –

+0

예 - 서버에서 데이터 세트를 업데이트하기 위해 폴링을 수행 할 때 수행하는 작업입니다. 모든 것을 가져 와서 KO + 매핑이 무엇이 바뀌 었는지 알아 내도록하십시오. – LogicMan

답변

0

체크 박스의 값을 저장할 필요가 없기 때문에 체크 박스의 값은 매번 지워집니다. 아래의 바이올린이 당신의 문제를 해결합니까? , 당신은 완전히 모든 타이머 업데이트에 뷰 모델의 모든 데이터를 교체하여 바이올린보고에서

<table> 
    <thead> 
     <th class="checkbox_th"/> 
     <th class="name_th" align="left">Sample</th> 
     <th class="status_th" align="left">Status</th> 
    </thead> 
    <tbody data-bind="template: {name: 'sampleRowTemplate', foreach: samples}"></tbody> 
    <script type="text/x-jquery-tmpl" id="sampleRowTemplate"> 
     <tr> 
      <td><input type="checkbox" name="select_sample" data-bind="checked: is_checked"/></td> 
      <td><span data-bind='text: sample_name'/> The checkbox =<span data-bind="text:is_checked"/></td> 
      <td><span data-bind='text: ""'/><td/> 
      </tr> 
       {{each sample_runs()}} 
       <tr> 
       <td/> 
       <td><span data-bind='text: $value.name'/></td> 
       <td><span data-bind='text: $value.status'/></td> 
      </tr> 
       {{/each}} 
       <!-- 
       <script type="text/x-jquery-tmpl" id="sampleRunTemplate"> 
       <td/> 
       <td>${name}</td> 
       <td>${status}</td> 
      </script> 
       <tr data-bind="template: {name: 'sampleRunTemplate', foreach: sample_runs }"></tr> 
       --> 

      </script> 
      </table>    


var mapping = { 
    'samples': { 
     key: function(item) { 
      return ko.utils.unwrapObservable(item.id); 
     }, 
     'sample_runs': { 
      key: function(item) { 
       return ko.utils.unwrapObservable(item.id); 
      } 
     } 
    } 
}; 

var data = {}; 
data.samples = [{ 
    id: "s1", 
    sample_name: "AR008", 
    is_checked: false,  
    sample_runs: [ 
     { 
     id: "rs1", 
     name: "run1", 
     status: "done"}]}]; 
var viewModel = ko.mapping.fromJS(data, mapping); 
ko.applyBindings(viewModel); 

// update the data every 2 seconds 
var i = 0; 
setInterval(function() { 
    var data = {}; 
    data.samples = [{ 
     id: "s1", 
     sample_name: "AR008" + i, 
     sample_runs: [ 
      { 
      id: "rs1", 
      name: "run" + i, 
      status: "done" + i}]}]; 
    // is this right? updateFromJS is deprecated 
    viewModel = ko.mapping.fromJS(data, viewModel); 
    i++; 
}, 2000); 
+0

모델에 체크 상태를 저장하여 언급 한 특정 증상을 해결하지만 원본 질문 자체에 대한 답변을 얻지 못합니다 - 어떻게 {{각}}없이 작동시킬 수 있습니까? "자식"행을 제거하고 부모를 업데이트하는 경우 확인란 상태는 모델로 이동하지 않고 KO에 의해 보존됩니다. 따라서, 해결 방법으로 물건을 저장하기 위해 모델을 변경하지 않고도 작업을 수행 할 수 있어야합니다. – LogicMan

+0

오케이 - 예제를 수정했으며 {{each}}는 사용하지 않습니다. 다음을보십시오 : http://jsfiddle.net/unklefolk/f7J4S/2/ –

+0

우선, 이것에 시간을 보내 주셔서 감사합니다. KO의 저자조차 포기했다. 나는 당신의 버전을 편집하여 그 체크 박스에 대한 데이터 바인딩을 제거했다. 그 때까지 무엇을했는지 알아낼 때까지 - 테이블을 3 컬럼 길이의 TD 안에 넣고 중첩 된 템플릿을 사용했다. KO foreach가 TR이 아닌 TABLE을 사용하는 이유는 모르겠지만 KO의 버그라고 생각합니다. 네가 한 일 이래로 나는 이것을 대답이라고 부른다. 감사! – LogicMan