2012-08-17 5 views
2

The Knockout mapping plugin documentation에는 "키"를 사용하여 객체를 고유하게 식별 할 수있는 섹션이 있습니다. 이 방법은 부분적으로 수정 된 객체의 모든 속성 표시를 완전히 바꾸는 대신 객체의 일부를 업데이트 한 다음 해당 부분 만 업데이트하는 방법을 설명합니다. 그것들은 간단한 예제에서 모두 훌륭하게 작동합니다. 여기서는 약간 더 질문을 명확하게하기 위해 수정했습니다. 내 수정 내용은 다음과 같습니다.녹아웃 매핑 - 키를 사용하여 중첩 된 객체를 고유하게 식별

  1. 2 초 후에 수정 된 이름으로 개체를 바꿉니다.

  2. 디스플레이의 변경되지 않은 부분을 강조 표시하여 업데이트가 발생할 때 실제로 교체되지 않는 것을 볼 수 있습니다.

1. 간단한 객체 (jsFiddle)

<h1 data-bind="text: name"></h1> 
<ul data-bind="foreach: children"> 
    <li><span class="id" data-bind="text: id"></span> <span data-bind="text: name"></span></li> 
</ul> 

<script> 
var data = { 
    name: 'Scot', 
    children: [ 
     {id : 1, name : 'Alicw'} 
    ] 
}; 
var mapping = { 
    children: { 
     key: function(data) { 
      console.log(data); 
      return ko.utils.unwrapObservable(data.id); 
     } 
    } 
}; 
var viewModel = ko.mapping.fromJS(data, mapping); 
ko.applyBindings(viewModel); 

var range = document.createRange(); 
range.selectNode(document.getElementsByClassName("id")[0]); 
window.getSelection().addRange(range); 

setTimeout(function() { 
    var data = { 
     name: 'Scott', 
     children: [ 
      {id : 1, name : 'Alice'} 
     ] 
    }; 
    ko.mapping.fromJS(data, viewModel); 
}, 2000); 
</script> 

그러나 나에게 분명하지 않다 내가 더 복잡한 중첩 된 데이터 구조에 대해 동일한 동작을 달성 할 방법이다. 다음 예제에서는 위 코드를 가져 와서 목록에 데이터를 래핑했습니다. 위와 동일하게 행동하고 싶지만 그렇지 않습니다. 하나의 속성이 변경되어 전체 디스플레이가 다시 표시됩니다. 위의 예제와 달리 데이터를 업데이트 한 후에는 강조 표시가 손실되기 때문에이를 볼 수 있습니다.

2. 더 복잡한 중첩 된 객체 내가 더 중첩 된 데이터 구조 주어진 첫 번째처럼 두 번째 예제 작업을 할 수있는 방법 (jsFiddle)

그래서 기본적으로 내가되어 부탁 해요 무엇
<!-- ko foreach: parents --> 
    <h1 data-bind="text: name"></h1> 
    <ul data-bind="foreach: children"> 
     <li><span class="id" data-bind="text: id"></span> <span data-bind="text: name"></span></li> 
    </ul> 
<!-- /ko --> 

<script> 
var data = { 
    parents: [ 
     { 
      name: 'Scot', 
      children: [ 
       {id : 1, name : 'Alicw'} 
      ] 
     } 
    ] 
}; 
var mapping = { 
    children: { 
     key: function(data) { 
      console.log(data); 
      return ko.utils.unwrapObservable(data.id); 
     } 
    } 
}; 
var viewModel = ko.mapping.fromJS(data, mapping); 
ko.applyBindings(viewModel); 

var range = document.createRange(); 
range.selectNode(document.getElementsByClassName("id")[0]); 
window.getSelection().addRange(range); 

setTimeout(function() { 
    var data = { 
     parents: [ 
      { 
       name: 'Scott', 
       children: [ 
        {id : 1, name : 'Alice'} 
       ] 
      } 
     ] 
    }; 
    ko.mapping.fromJS(data, viewModel); 
}, 2000); 
</script> 

? id가 각 자식마다 고유하다고 가정 할 수 있습니다 (따라서 Scott 외에 다른 부모를 추가하면 그의 자식은 id = 2 등으로 시작합니다).

답변

2

재미있는 관찰과 멋진 글쓰기. 부모뿐만 아니라 자식에게도 키를 정의하면 작동하는 것처럼 보입니다. 이 바이올린을보십시오 : 그것은 부모의 생성자는 자식 매핑을 수행하는 부모와 자녀를위한 인스턴스화 뷰 모델의 기능을 정의

http://jsfiddle.net/8QJe7/6/

.

+0

감사합니다. 더 간단하고 직관적 인 방법이 있었으면 좋겠지 만 부모와 아동의 키를 정의해야한다는 것은 이상한 것처럼 보입니다. 그게 왜? 또한 ko.mapping.fromJS를 여러 번 호출 할 때 상당한 성능 저하가 발생하는지 알고 있습니까? 나는 그것이 일을하는 것이 합리적이든 모든 것을 순진하게 업데이트 할 것인가에 따라 상황에 달려 있다고 생각합니다. – dumbmatter

+1

매핑 플러그인의 내면에 대해 조사하지는 못했지만 객체와 DOM 요소의 계층 구조를 통해 작동하므로 하위 요소의 부모를 식별 할 수 있어야하는 데는 충분한 이유가 있다고 생각합니다. 다시 성능 - 내 뷰 모델 계층 구조는 약 6 단계이며, 모두 내 생중계와 같은 키로 자녀를 만드는 인스턴스 함수로 구현됩니다. 각 레벨의 형제 수는 매우 다양하지만 응용 프로그램의 현실적인 사용 매개 변수 내에서 위에서 아래로 맵핑 업데이트를 원활하게 수행합니다. 모든 앱이 다릅니다. –

+1

나는 여러 가지 복잡한 이유로 실제로 내 자신의 매핑 프로세스를 시작했지만, 결국 매핑 플러그인을 활용하기 위해 대신 내 응용 프로그램 논리를 포기하고 다시 생각했습니다.고유 키에 의한 중첩 된 객체 및 배열의 ​​대규모 업데이트를 수행하는 것이 쉬운 일이 아니라는 것을 알았습니다. 그리고 그들은 내가 생각하기에 그 플러그인으로 꽤 잘했습니다. –

관련 문제