1

항목 '방법을 유지하는 관찰 가능한 배열 채우기 :녹아웃 매핑 - 나는 다음과 같은 기본적 문제에 직면했습니다

  • 내가 관찰 특성 및 방법 항목의 관찰 배열을 포함하는 녹아웃 뷰 모델이있다.
  • 서버에서 데이터를 가져와야합니다. 이 메소드는 서버에서 데이터를 가져온 후에 존재해야합니다. 그래서 나는 새로운 ViewModel을 생성 한 다음 서버로부터 온 값을 갱신한다. mapping와 내가 만드는 경우
  • , var newObj = ko.mapping.fromJS(data) 결과 배열을 사용하여 새 개체를 항목, 을 가지고 있지만 해당 항목이 어떤 방법이 없다 (이 작동하지 않습니다, 결과 배열은 NO 항목이 없음). 내 바인딩을 망쳐 놨어.

내 문제의 바이올린 : 무엇가에 대한 항목이 할 수있는 가장 좋은 방법입니다 : http://jsfiddle.net/claykaboom/R823a/3/

마지막 질문은 (그것은 당신이 "서버에서 데이터로드"클릭 util을 작동) 이전에 선언 된 메서드를 유지하기 위해 모든 항목을 반복하고 항목의 속성을 채우는 것과 같이로드 프로세스를 너무 복잡하게하지 않고도 최종 배열을 만들 수 있습니까?

감사합니다.

답변

2

코드가 조금 바뀌 었습니다. JSFiddle의 버전을 확인하십시오.

var jsonFromServer = '{"ModuleId":1,"Metadatas":[{"Id":1,"MinValue":null,"MaxValue":null,"FieldName":"Teste","SelectedType":"String","SelectedOptionType":null,"IsRequired":true,"Options":[]}]}'; 

귀하의 코드 나던 작업하여 jsonFromServer 변수가 귀하의 질문에 설명 된 것처럼 우리가 바인딩에 필요한 방법을 포함하지 않기 때문에.

self.LoadDataFromServer = function() { 

    var jsonFromServer = '{"ModuleId":1,"Metadatas":[{"Id":1,"MinValue":null,"MaxValue":null,"FieldName":"Teste","SelectedType":"String","SelectedOptionType":null,"IsRequired":true,"Options":[]}]}'; 

    ko.mapping.fromJSON(jsonFromServer, mapping, self); 
} 
:
var mapping = { 
    'Metadatas': { 
     create: function(options) { 
      var newMetaData = new MetadataViewModel(options.parent); 

      newMetaData.Id(options.data.id); 
      newMetaData.FieldName(options.data.FieldName); 
      newMetaData.SelectedType(options.data.SelectedType); 
      newMetaData.SelectedOptionType(options.data.SelectedOptionType); 
      newMetaData.IsRequired(options.data.IsRequired); 
      newMetaData.Options(options.data.Options); 

      // You can get current viewModel instance via options.parent 
      // console.log(options.parent); 

      return newMetaData; 
     } 
    } 
} 

그런 다음 내가이에로드 기능을 변경 : - (> Metadatas는)

그래서 우리는 메타 데이터는이 같은 매핑 과정에서 객체에 대한 함수를 만드는 사용자 정의를 정의 할 필요가

새로운 viewModel을 선언하고 ko.applyBindings를 다시 호출 할 필요가 없습니다. 업데이트 된 매핑을 현재 viewModel에 할당하면 충분합니다. 자세한 내용은 this link을 확인하십시오. 오브젝트 구성 파트 사용자 정의를 찾으십시오.

마지막 질문은 무엇로드 프로세스가 너무 복잡하지 않고 최종 배열에 항목이 할 수있는 가장 좋은 방법은, 이전에 유지 모든 항목을 반복하고 하기 위해 항목의 속성을 채우는 등 로 선언 된 메소드?

내가 아는 바로는 당신의 객체 구현으로 이것을 할 수있는 쉬운 방법이 없다는 것입니다. 당신의 물건은 단순하지 않습니다. 그들은 데이터와 함수를 함께 포함합니다. 따라서 사용자 정의 함수를 정의해야합니다. 그러나 당신이 이것을 분리 할 수 ​​있다면, 당신은 객체 생성을 커스터마이징 할 필요가 없다.정의가 상기 정의 함수를 작성하지 않고는 ko.mapping.fromJSON (newMetaDataArray {} MetadataViewModelInstance.MetadataArray)을 호출 할 수있는 이러한 구조

--> Metadata : which contains only simple data 
--> MetadataViewModel : which contains Metadata observableArray and its Metadata manipulator functions 

: 두 개의 다른 물체에 MetadataViewModel 분리해서 예를 들어

매핑 프로세스.

+0

글쎄! 그것은 매우 완전한 대답입니다! 알겠습니다. 그것은 매력처럼 작동했습니다. 그러나 모델의 복잡성으로 인해 서버의 각 속성을 클라이언트로 전달하게됩니다. 즉, 새 속성을 추가하면 오류가 발생할 확률이 높은 코드가 변경된다는 의미입니다. – ClayKaboom