MVC Knockout.js 응용 프로그램모범 사례는
나는 ASP.NET/MVC 및 KnockoutJs를 사용하여 주로 기록되는 응용 프로그램이 있습니다. 이제 많은 경우에 필자는 SQL 데이터베이스에 동기화해야하는 뷰 (필자는 추가 된 컬렉션 항목을 추가해야하고 제거 된 컬렉션 항목은 데이터베이스에서 제거해야 함)에 대한 컬렉션을 보유하고 있습니다. 내 클라이언트, 뷰 모델 및 서버 코드에서 사용해야하는 모범 사례를 알고 싶습니다. 이 요구 사항을 여러 번 접했고이를 처리 할 수있는 최상의 방법을 찾아야합니다.
하나 내가 시작하는 항목에 대한 클라이언트와 서버 뷰 모델 목록 속성을 만들 수
방법은, 항목을 추가 및 삭제 된 항목을. 내 논리는 서버 업데이트에서 상당히 간단하며 시작 항목은 무시되고 추가 된 항목은 삽입되며 삭제 된 항목은 제거됩니다. 서버 코드는 단순히 추가되거나 제거 된 콜렉션 항목을 반복 할 수 있지만 클라이언트는 목록을 다루는 것이 더 복잡 할뿐만 아니라보다 자세한보기 모델을 가지고 있습니다.
또 다른 내 모델에서 단일 목록을 만들 수 있습니다 다음 업데이트에 내가 원래 값을 추가하고의 차이에 따라 목록을 제거 만들기 비교할 수
방법. 이는 서버 업데이트 로직을 좀 더 복잡하게 만들고 서버/클라이언트 뷰 - 모델과 클라이언트 스크립트를 덜 복잡하게 만듭니다. 이것에 대한 문제는 어떻게 든 항목이 서버에 게시되지 않으면 모든 것이 지워질 것입니다.
세 번째 방법
어쩌면 내가 더러운 항목의 목록이 있어야합니다 추가 또는 플래그 및 제출 때 서버에 적절한 조치를 할 삭제 된. 그런 다음 내 목록이 서버의 뷰 모델의 일부이거나 업데이트 메서드의 보조 매개 변수 인 컬렉션이되어야합니다.
public ActionResult Update(ViewModel viewModel,
List<ListTypeViewModel> dirtyItems) { ... }
나는 이것이 잘 작동한다고 생각합니다. 그러나 항목이 이전에 새 항목과 제거 된 항목에서 데이터베이스에 저장되었는지 여부를 구별하는 패턴에 약간의 문제가 있습니다. I added a fiddle to support this on the client. I should be using this pattern.
다른 답변 어쩌면?
이 문제를 해결할 수있는 확실한 것이없는 경우 알려 주시기 바랍니다. 이 시나리오에서는 사용자가 취소 버튼을 클릭하여 변경 사항을 콜백으로 롤백하려는 경우 서버에서 목록을 업데이트하라는 Ajax 요청이 즉시 적용되지 않습니다.
삭제, 편집 또는 항목 추가를위한 서버 측 코드는 항상 항목의 최종 목록을 반환하므로 프런트 엔드를 업데이트하는 데 사용할 수 있습니다. 그렇게하면 프런트 엔드는 항목 컬렉션 백엔드에서 방금 발생한 일을 알 필요가 없으며 서버에서 응답을받을 때마다 처음부터 모든 것을 다시 작성합니다. –
내가 틀릴 수도 있지만이 문제를 해결할 수 있을지 확신하지 못합니다. 나는 서버가 무엇을하는지 클라이언트에게 신경 쓸 필요가 없다. 하지만 확실히 클라이언트에서 처리해야합니다. – jwize
나는 당신의 문제를 오해했을지도 모른다. 기본적으로 목록을 동기화하기 위해 내가 아는 바로는, 물건을 비교하는 것보다 "처음부터"만드는 것이 항상 좋다. 예를 들어 사용자가 2 개 항목을 삭제하고 2를 편집 한 다음 마지막으로 2 개를 같은 모음에 추가 한 다음 변경 사항을 서버에만 제출하면 가능한 경우 전체 수집 서버 측을 삭제하고 다시 작성하는 것이 더 편리합니다. 클라이언트가 보낸 목록 물론 이것은 항상 가능하지는 않습니다.이 경우 목록이 클라이언트 측에서 업데이트 될 때마다 서버 측에서 조치를 취해야 할 수도 있습니다 ... –