The Knockout mapping plugin documentation에는 "키"를 사용하여 객체를 고유하게 식별 할 수있는 섹션이 있습니다. 이 방법은 부분적으로 수정 된 객체의 모든 속성 표시를 완전히 바꾸는 대신 객체의 일부를 업데이트 한 다음 해당 부분 만 업데이트하는 방법을 설명합니다. 그것들은 간단한 예제에서 모두 훌륭하게 작동합니다. 여기서는 약간 더 질문을 명확하게하기 위해 수정했습니다. 내 수정 내용은 다음과 같습니다.녹아웃 매핑 - 키를 사용하여 중첩 된 객체를 고유하게 식별
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 등으로 시작합니다).
감사합니다. 더 간단하고 직관적 인 방법이 있었으면 좋겠지 만 부모와 아동의 키를 정의해야한다는 것은 이상한 것처럼 보입니다. 그게 왜? 또한 ko.mapping.fromJS를 여러 번 호출 할 때 상당한 성능 저하가 발생하는지 알고 있습니까? 나는 그것이 일을하는 것이 합리적이든 모든 것을 순진하게 업데이트 할 것인가에 따라 상황에 달려 있다고 생각합니다. – dumbmatter
매핑 플러그인의 내면에 대해 조사하지는 못했지만 객체와 DOM 요소의 계층 구조를 통해 작동하므로 하위 요소의 부모를 식별 할 수 있어야하는 데는 충분한 이유가 있다고 생각합니다. 다시 성능 - 내 뷰 모델 계층 구조는 약 6 단계이며, 모두 내 생중계와 같은 키로 자녀를 만드는 인스턴스 함수로 구현됩니다. 각 레벨의 형제 수는 매우 다양하지만 응용 프로그램의 현실적인 사용 매개 변수 내에서 위에서 아래로 맵핑 업데이트를 원활하게 수행합니다. 모든 앱이 다릅니다. –
나는 여러 가지 복잡한 이유로 실제로 내 자신의 매핑 프로세스를 시작했지만, 결국 매핑 플러그인을 활용하기 위해 대신 내 응용 프로그램 논리를 포기하고 다시 생각했습니다.고유 키에 의한 중첩 된 객체 및 배열의 대규모 업데이트를 수행하는 것이 쉬운 일이 아니라는 것을 알았습니다. 그리고 그들은 내가 생각하기에 그 플러그인으로 꽤 잘했습니다. –