2016-06-15 3 views
0

VisitEntries 컬렉션을 보유하고있는 루트 녹아웃 모델을 가지고 있는데,이 각각의 항목에는 RoomProfile이라는 개체가 있습니다. 사용자가 방문 항목을 만들 때 (방문 목록에 회의실 추가) 회의실의 프로필 데이터가로드되어 해당 모임 내 사용자에게 표시되어야합니다. 하지만 관련 모델을 업데이트 할 수는 없습니다. 전에 다른 분야에서 아무런 문제가 없었습니다. 내 뿌리 mappedModelVisitEntryToAdd 사본을 만들거나 컬렉션 안에 있기 때문에 문제가 있다고 생각합니다. 나는 잘 모르겠다. 그러나 나는이 일을했을 때 다른 시간과 유일한 차이점이있다.녹아웃 매핑 fromJS fromJSON이 컬렉션 내에서 작동하지 않습니까?

mappedModel.addVisitEntry = function() { 

     var visitEntryToAdd = ko.mapping.fromJS(ko.mapping.toJS(mappedModel.VisitEntryToAdd)); 

     $.ajax({ 
      url: '/GetRoomProfileForVisit', 
      type: 'POST', 
      data: ko.mapping.toJSON({ Id: visitEntryToAdd.SelectedRoom.Id() }), 
      dataType: "json", 
      contentType: 'application/json; charset=utf-8', 
      success: function (data) { 

       if (data !== null) { 
        console.log("Checking entry before assigning room profile data: \n" + ko.mapping.toJSON(visitEntryToAdd)); 
        console.log("Room Profile Data Loaded:\n" + ko.mapping.toJSON(data)); 
        ko.mapping.fromJS(data, {}, visitEntryToAdd.RoomProfile); 
        console.log("Checking entry after assigning room profile data: \n" + ko.mapping.toJSON(visitEntryToAdd)); 
       } 

       mappedModel.VisitEntries.push(visitEntryToAdd); 

      } 
     }); 
    } 

상기 코드 거치지 :

우선 CONSOLE.LOG는 visitEntryToAdd는 I 방 프로파일 데이터를 추가하기 전에 널 (null)로 설정 RoomProfile 포함한 모든 필드가 정확한 것을 나타낸다.

두 번째 console.log는 내 ajax 메소드가 데이터를 반환했음을 확인하고 적절하게 구성되었음을 확인합니다.

세 번째 console.log는 동일한 visitEntryToAdd을 나타내며 여기에 RoomProfile은 여전히 ​​null입니다.

나는 수행하여이 작업을 얻을 수있었습니다 :

visitEntryToAdd.RoomProfile(ko.mapping.fromJS(data)); 

그러나 나는 그것이 사용의 것과 만 fromJS 명령을 사용하여 작동하지 않는 이유를 모르겠습니다. 누군가가 설명을 해줄 수 있다면 나는 대답으로 표시 할 것입니다.

+0

실수입니까? 코드 샘플에 정의되지 않은 일부 labVisitEntryToAdd를 console.logging하고 있습니까? – DonSteep

+0

복사시 추상화 실수. – SventoryMang

+0

가능하다면 Ajax 코드를 스터 빙하여 [mcve]를 만들고 가능한 한 적은 수의 예제 데이터를 포함하고 컨텍스트의 모델 코드보기/실행 가능하게 만드십시오. – Jeroen

답변

1

매핑 전에 visitEntryToAdd.RoomProfile이 null 인 경우 효과적으로 ko.mapping.fromJS(data, {}, null)을 말하고 새로 매핑 된 데이터를 viewmodel에 연결하는 것이 없습니다.

당신은 {}에 방문 항목에 RoomProfile를 초기화하는 대신 null, 또는으로 매핑을 실행하여이 문제를 해결 할 수 있습니다 매핑 뷰 모델의 루트와의 RoomProfile 필드에서 시작됩니다

ko.mapping.fromJS({RoomProfile: data}, {}, visitEntryToAdd); 

이 방법 그것은 지정할 수 있습니다. {} 필드를 초기화하는 것이 좋으면 viewmodel의 RoomProfile 필드가 바뀌지 않고 해당 필드 만 업데이트되어 visitEntryToAdd -> RoomProfile의 링크가 유지되므로 제대로 작동합니다.

+0

그게 효과가 있어요. 고마워. 나는 이걸 사용하여 내 게시물에서 알아 낸 방법으로 더 기분이 좋습니다. – SventoryMang