2012-09-18 2 views
4

두 개의 함수 generatetest이 있습니다. 사용자가 generate 버튼을 클릭하면 test 함수가 호출됩니다. 오류는 테스트 기능이 라인에서 발생합니다ko.computed의 값을 반환하는 함수를 전달하십시오.

Pass a function that returns the value of the ko.computed.

:

var unmapped = ko.mapping.toJS(this); 

this이 ko.observable 특성을 가진 내 뷰 모델이다 : 나는 다음과 같은 오류가 발생합니다.

여기에 두 가지 기능이 있습니다. test의 내용을 generate으로 옮기면 모든 것이 잘 작동하지만 두 가지 기능을 수행하는 데 필요한 논리가 필요합니다. 내가 무엇을 할 수 있을지?

나는 여기에서 매우 붙어있다. 어떤 도움이라도 크게 평가 받게 될 것입니다.

generate = function() { 
      if (!omega.validatableFranchiseGeneration.validate()) { 
       return false; 
      } 
      omega.franchiseInfo.IsForGeneration(true); 

      test(); 
     } 

var test = function() { 
     getIpsAndPorts(); 

     for (var i = 0; i < omega.franchiseInfo.LanguagesInfoViewModel().length; i++) { 
      if ($.isArray(omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel)) { 
       omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel = omega.franchiseInfo.LanguagesInfoViewModel()[i].SubMenuItemsViewModel[0]; 
      } 
     } 

     var unmapped = ko.mapping.toJS(this); 

     var jsonData = ko.toJSON(unmapped); 
     $.ajax({ 
      url: "/franchise/Save", 
      type: "POST", 
      // data: ko.toJSON({ folderName: FolderName }), 
      data: { franchiseInfoViewModel: jsonData }, 
      //traditional: true, 
      //contentType: "application/json; charset=utf-8", 
      dataType: 'json', 
      success: function (data, textStatus, xhr) { 
       window.location.href = data.redirectToUrl; 
      }, 
      error: function (request, status, error) { 
       jsonValue = jQuery.parseJSON(request.responseText); 
       omega.franchiseInfo.errorMessages([]); 
       for (var i = 0; i < jsonValue.errorMessages.length; i++) { 
        omega.franchiseInfo.errorMessages.push({ errorMessage: ko.observable(jsonValue.errorMessages[i].ErrorMessage) }); 
       } 
       for (var i = 0; i < omega.franchiseInfo.LanguagesInfoViewModel().length; i++) { 
        InitializeViewLanguagesInfo(omega.franchiseInfo.LanguagesInfoViewModel()[i]); 
       } 
      } 
     }); 
    } 

답변

1

모든 코드를 보지 않고이 확실하게 어렵지만, (그대로)을 직접 포함하는 경우에 발생 작동하는 코드가 있다면, 나는 this 당신이 그것을 생각하지 것입니다 내기 기꺼이 test 함수에 있습니다. thisgenerate 내부와는 다른 의미로 test 함수 내부에 있습니다.

Chrome 또는 Firebug를 실행하고 var unmapped = ko.mapping.toJS(this); 줄에 중단 점을 설정하십시오. 프로그램을 실행하고 브레이크 포인트가 콘솔에 도달했을 때 this을 봅니다. ViewModel입니까? this 만약

당신이 항상이 같은 test를 호출 할 수 generate 내부에 무엇을 기대입니다 :

test.apply(this); 

이 명시 적으로 메소드 호출에 대한 this의 컨텍스트를 설정합니다.

또 다른 옵션은 변수를 ViewModel에 설정하는 것입니다. 이것은 일반적으로 상단에서 이루어지며 다음과 같습니다 : var self = this;. 이 변수를 작성하면 self' inside any functions within the outer "function" scope, and not have to worry about the value of이 변동하는 것을 나타낼 수 있습니다. http://jsfiddle.net/jearles/aLFWe/

열기 크롬이나 파이어 버그 콘솔과 기록 물체를 보면 : -

여기

은 무슨 일이 일어나고 있는지 내가 생각 시뮬레이션하는 간단한 바이올린입니다. 참고로 updatea()을 방금 호출했을 때 Window이 기록 된 개체 였지만 원래 클릭 기능에 Object이었고 updateb.apply(this) 또는 updatec() (self을 참조)이라고했을 때 유의하십시오.

+0

답장을 보내 주셔서 감사합니다. 나는 내 논리를 리팩터링하고 다른 해결책으로 옮겼다. 그럼에도 불구하고 나는 당신의 대답을 받아들입니다. – Mdb

관련 문제