2012-07-27 3 views
1

내가 만든이 무한 루프를 디버깅하는 데 어려움을 겪고 있습니다. Knockout.js에서는 두 요소의 변경 이벤트를 data-bind="event:{change:save_data}" 마크 업을 사용하여 바인딩했습니다. 그런 다음 save_data 함수에서 서버에 Ajax PUT을 실행했습니다.구독 및 AJAX 데이터 전송 후 녹아웃 최대 호출 스택

var ViewModel = function(config) { 
    var self = this; 

// initial call to mapping to create the object properties 
    ko.mapping.fromJS(config, {}, self); 

    self.save_data = function() { 
    $('#ajax-console').append('<p>Saving...</p>');   
     $.ajax({ 
      url: '/echo/json/', 
      data: ko.toJS(self), 
      type:'put', 
      success: function(data) { 

      }, 
      dataType: 'json' 
     }); 
    } 

}; 

이 실행하고 입력 또는 체크 박스 중 하나를 변경 크롬 나에게 다음과 같은 오류를 제공합니다 : RangeError: Maximum call stack size exceeded.

내가 뭘 잘못하고 있니? AJAX 호출에서 필드의 값 중 하나가 변경되고있는 것 같습니다. 해결 방법은 AJAX 호출이 이미 경로에 있고 호출하지 않는지 감지하는 것입니다.하지만 무슨 일이 일어나는지 알고 싶습니다.

깨진 예 : http://jsfiddle.net/btV9t/10/

근무 예 : 모든 http://jsfiddle.net/btV9t/8/

덕분에 여기

내 바이올린입니다.

답변

2

매핑 플러그인을 사용할 때 표준 ko.toJS과 호환되지 않는 뷰 모델을 생성하기 때문에 매핑 플러그인을 사용할 때는 toJS 호출에도 사용해야합니다.

데이터 라인은 다음과 같이해야합니다 :

여기
data: ko.mapping.toJS(self), 

working fiddle

+0

감사합니다, 나는 내 응용 프로그램에 있음을 변경합니다. 정말 이것이 _answer_이라고 말할 수는 없지만 좋은 메모입니다. – StingeyB

+0

@StingeyB 아직 다른 문제가 있습니까? 바이올린은 그 변화와 함께 일하고 있습니다. 그래서 당신이 다른 것들을 알고 있는지 모르겠습니다. 어떻게 이것이 답이 아닌가? – Tyrsius