2012-03-09 3 views
6

나는 꽤 오랫동안 이것을 알아 내려고 노력해 왔습니다. 이 문제를 해결할 수있는 것을 찾지 못했습니다.하지만 제가 틀렸다면 수정하십시오.KnockoutJS : 매핑을 사용하여 viewModel에 데이터 업데이트/삽입

문제점 : JSON API의 데이터가 중첩 된 배열/오브젝트 구조로 들어 있습니다. 필자는 매핑을 사용하여 초기에 모델을 내 데이터로 채 웁니다. 이를 업데이트하기 위해 새 데이터가 도착하면 모델을 확장하거나 기존 데이터를 업데이트하려고합니다.

맵핑 옵션 키가 발견되면이 트릭을 수행해야하지만 매핑 옵션의 기능을 잘못 이해했을 수 있습니다. 나는이 문제를 삶은했습니다

이 예에 의해 표현된다 :

var userMapping = { 
    key: function(item) { 
     return ko.utils.unwrapObservable(item.id); 
    } 
}; 

// JSON call replaced with values 
var viewModel = { 
    users: ko.mapping.fromJS([], userMapping) 
}; 

// Should insert new - new ID? 
ko.mapping.fromJS([{"id":1,"name":"Foo"}, {"id":2,"name":"Bar"}], userMapping, viewModel.users); 

// Should only update ID#1 - same ID? 
ko.mapping.fromJS([{"id":1,"name":"Bat"}], userMapping, viewModel.users); 

// Should insert new - New ID? 
ko.mapping.fromJS([{"id":3,"name":"New"}, {"id":4,"name":"New"}], userMapping, viewModel.users); 

ko.applyBindings(viewModel);​ 

바이올린이 : http://jsfiddle.net/mikaelbr/gDjA7/

당신이 볼 수 있듯이, 첫 번째 줄은 데이터를 삽입합니다. 문제 없다. 그러나 업데이트하려고하면 내용이 바뀝니다. 세 번째 매핑과 동일합니다. 콘텐츠를 확장하는 대신 내용을 대체합니다.

잘못 사용하고 있습니까? 매핑을 사용하기 전에 컨텐츠를 "수동으로"확장해야합니까?

편집 솔루션 :
I는 현재의 모든 모델을 저장하는 제 헬퍼 어레이를 구비하여 케이스를 해결했다. 새 데이터에서이 배열을 확장하고 축적 된 항목을 포함하도록 뷰 모델을 업데이트했습니다.

업데이트 (내 경우 WebSocket 메시지)에서 모델을 반복하고 해당 항목의 내용을 변경 한 다음 valueHasMutated() 메서드를 사용하여 변경된 값을 Knockout 라이브러리에 전달했습니다.

답변

4

는 매핑 플러그인이 정확히 작동하고. 컬렉션에서 fromJS으로 전화를 걸면 실제로 매핑 플러그인에게 이것이 해당 컬렉션의 새로운 콘텐츠임을 알리는 것입니다. 예 :

두 번째 줄에서 업데이트 여부 또는 단순히 id : 2 제거 여부를 어떻게 알 수 있습니까?

데이터를 추가 할 수는 있지만 간단히 업데이트로 간주하는 적절한 방법에 대해서는 언급 할 수 없습니다. 매핑 된 배열에는 특정 항목을 찾는 데 도움이되는 mappedIndexOf과 같은 유용한 메소드가 있습니다. 업데이트 데이터 세트를 수신하면 루프를 통해 루프를 돌리고 항목을 찾아 해당 특정 항목에 대한 매핑 .fromJS 호출로 업데이트하십시오. 이것은 재사용 가능한 방법으로 쉽게 일반화 될 수 있습니다.

+0

예. 이것은 내가 어떻게 그것을 해결했는지에 대한 것입니다. – mikaelb

+0

이것에 대한 의견 : http://stackoverflow.com/questions/20397054/knockout-js-mapping-keys-and-kendo-ui-grid – jtromans

0

예. 먼저 모든 데이터를 목록 또는 배열로 수집 한 다음 해당 목록에 매핑을 적용해야합니다. 그렇지 않으면 viewModel의 값을 덮어 쓰게됩니다.

1

ko.mapping.updateFromJS()을 사용하여 기존 값을 업데이트 할 수 있습니다. 그러나 인스턴스에 문제가 될 수있는 새로운 값을 추가하지는 않습니다. 자세한 내용은 아래 링크를 참조하십시오. 나는 그것에을 기대하는 것처럼 당신의 예제 코드를 찾고에서

Using updateFromJS is replacing values when it should be adding them

+4

2011 년 8 월에 updateFromJS() 메서드가 제거되었습니다. https://github.com/SteveSanderson/knockout.mapping/commit/bff3c1864a5fd45289933b35de1ef70af4aed6b5 – mikaelb

+0

+1 @mikaelb - 저는 그것을 몰랐습니다. 정보 주셔서 감사합니다. –

관련 문제