2012-07-05 2 views
2

내 viewmodel에서 함수를 정의하는 데 문제가 있습니다.Json 데이터로 채워진 녹아웃 뷰 모델 내부의 함수를 정의하는 방법

jquery getJSON을 통해 json 데이터를 가져 와서이 데이터를 내 viewmodel에 매핑합니다.

$.getJSON('/Company/GetCompanies', function(data) { 
    var viewModel = new CompanyViewModel() 
    viewModel.model = ko.mapping.fromJS(data) 
    ko.applyBindings(viewModel) 
}); 

다음은 내 viewmodel입니다. 당신은 내가 뭘 원하는지 알 수 있듯이 companyName

var CompanyViewModel = function() { 
    var self = this; 

    self.companyName = function() 
     return model.CompanyName; 
    }; 
} 

그럼 내가 그러나 <span data-bind="text: companyName" /> 같은이 기능을 사용하려면 호출 된 함수를 통해 뷰 모델의 속성 중 하나를 반환하고, 자바 스크립트 기능 평가 및 텍스트로 반환되지 않습니다 .

웹상의 Knockout 예제를 살펴 보았지만 모두 계산 된 관찰 기록을 사용하고 있습니다.

이 방법을 사용할 수 있습니까? 감사.

+1

왜 당신이 계산 관찰을 사용하지 않으려는? – aaberg

+0

물론 사용할 수는 있지만 companyName을 준수 할 필요는 없습니다. 내 코드에 문제가 무엇인지 궁금 하네. –

+0

'return self.CompanyName; '이 아니어야합니까? – Ingro

답변

1

나는 몇 가지 테스트를했습니다, 이것은 나를 위해 작동 :

return self.model()[0].CompanyName;

을 그리고 그것을 호출 data-bind="text: companyName()"

편집 :

 var CompanyViewModel = function() { 
      var self = this; 

      self.companyName = function(){ 

       return self.model()[0].CompanyName; 
      }; 
     } 

     $.getJSON('/Company/GetCompanies', function(data) { 
      var viewModel = new CompanyViewModel(); 
      viewModel.model = ko.mapping.fromJS(data); 
      ko.applyBindings(viewModel); 
     }); 

이것은 가정 작동 JSON 데이터가 다음과 같은 형식으로 반환됩니다.

[{"CompanyName":"Stack","SomeOtherField":"SomeOtherValue"},...]; 

그리고 내부에는 회사가 하나만 있습니다.

4

이 시도 :

var CompanyViewModel = function(data) { 
    ko.mapping.fromJS(data, {}, this); 
}; 

CompanyViewModel.prototype.fileTaxes = function() { 
    console.log("Company is filing taxes."); 
}; 

$.getJSON('/Company/GetCompanies', function(data) { 

    // data would look something like this: 
    // data: { companyName : "MicroStrategy", 
    //   founderName : "etc" } 
    var viewModel = new CompanyViewModel(data); 
    ko.applyBindings(viewModel) 
}); 
+0

회사 기능은 어디에 있습니까? viewmodel 내부에서 함수를 정의하려고합니다. –

+0

원래 코드를 편집하여 CompanyViewModel 클래스에 메소드를 추가하는 예제를 포함 시켰습니다 (fileTaxes라고 함). ko.mapping.fromJS 함수로 처리되므로 companyName 함수를 더 이상 만들 필요가 없습니다. –