2013-05-29 2 views
0

가장 좋은 방법은 무엇입니까? 그러나 http://knockoutjs.com/documentation/computedObservables.html에는 "속성이 계산 된 관찰 가능인지 결정"이라는 섹션이 있습니다. 이 속성이 계산 된 관찰 가능 여부를 확인하기 위해 isComputed을 사용했습니다.KnockoutJS : 서버에 데이터를 전달하기 전에 계산 된 관측 값을 제외하십시오.

값을 내 서버에 전달하기 전에 계산 된 관찰 가능 항목을 self.formItems()에서 제외/제거하고 싶습니다.

여기는 데이터를 서버로 다시 보내는 AJAX 요청 코드의 일부입니다.

for (var prop in self.formItems()) { 
    // console.log(ko.isComputed(self.formItems()[prop].isRadio)); //true (because this is computed) 
    // console.log(ko.isComputed(self.formItems()[prop].field_label)); //false (because this is not a computed element) 
    for(var form_prop in self.formItems()[prop]) { 
     // console.log(form_prop+': '+ko.isComputed(self.formItems()[prop][form_prop])); 
     if(self.formItems()[prop].hasOwnProperty(form_prop) && !ko.isComputed(self.formItems()[prop][form_prop])) { 
      // result_no_computed_observables[prop][form_prop] = ko.toJS(self.formItems()[prop][form_prop]); 
      console.log(self.formItems()[prop][form_prop]); 
     } 
     // ko.cleanNode(self.formItems()[prop][form_prop]) 
    } 
} 

$.ajax({ 
    'type': 'POST', 
    'url': appUrl+'/editors/saveform/'+memberListId+'.json', 
    'cache': false, 
    'dataType': 'json', 
    'contentType': 'application/json', 
    'data': ko.toJSON({ 
     'id': theFormDetails.id(), 
     'name': theFormDetails.name(), 
     'description': theFormDetails.description(), 
     'success_text': theFormDetails.success_text(), 
     'success_redirect': theFormDetails.success_redirect(), 
     'form_elements': self.formItems()  /* <--- I would like to remove computed observables from this*/ 
    }), 
    'success': function(result) { 
     alert('success!!!'); 
    }, 
    'statusCode': { 
     403: function() { 
      alert("Your session has probably expired. Please login again."); 
      window.location = appUrl+"https://stackoverflow.com/users/login"; 
     } 
    } 
}); 

아이디어가 있으십니까?

감사합니다.

+0

[매핑 플러그인] (http://knockoutjs.com/documentation/plugins-mapping.html)을 확인 했습니까? 모델을 다시 원시 JSON으로 변환하려면'ko.mapping.toJS()'를 호출하면 모든 종류의 동작을 제어 할 수 있습니다. –

+0

@MikeChristensen 나는 console.log (ko.mapping.toJS (self.formItems()))'를 시도해 보았습니다. 그러나이 문제로 어떻게 문제를 해결할 수 있는지 보지 못했습니다. 죄송합니다. – wenbert

+0

매핑 플러그인을로드합니까? –

답변

4

먼저, mapping plugin을 사용하는 것이 좋습니다. 이것은 다운로드하고 참조해야하는 선택적 플러그인입니다. 이를 통해 serialization 및 deserialization 함수에 구성 속성을 전달하여 직렬화되는 필드와 방법을 정확하게 제어 할 수 있습니다. 기본적으로, 당신처럼 뭔가를 할 수있을 것입니다 :

var json = ko.mapping.toJS(model, { ignore: ['form_elements'] }); 

모델에서 form_elements 속성을 제외하려면.

플러그인을 사용하지 않고이 작업을 수행하는 또 다른 방법은 toJSON 메서드를 재정의하는 것입니다. 다음과 같음 :

viewModel.prototype.toJSON = function() { 
    var copy = ko.toJS(this); 
    delete copy.form_elements; // Remove form_elements field 
    return copy; 
}; 

Here's an example

관련 문제