2013-06-26 1 views
0

KnockoutJS with WebApi. 사용자 지정 바인딩을 시도 할 때 사용자 지정 바인딩 함수에 바인딩 데이터를 전달할 수 없습니다.KnockoutJS, WebApi, 사용자 지정 바인딩을 사용할 때 valueAccessor에 값이 없습니다.

나는 이틀 동안 내 머리를 두드리는 중이다. 확실히 여기에 뭔가 빠져있다.

모든 가이드 라인, 기사 또는 샘플 코드는 크게 감사하겠습니다. 고마워.

<script> 
function ViewModel() { 
    var self = this; 
    self.items = ko.observableArray(); 

    // This is getting data, and tested have data returned. 
    var baseUri = 'api/items'; 
    $.getJSON(baseUri, self.items); 
} 

$(document).ready(function() { 
    ko.bindingHandlers.testBinding = { 
     init: function (element, valueAccessor) { 
      var value = valueAccessor(); 
      var valueUnwrapped = ko.utils.unwrapObservable(value); 
      // This is always 0. 
      alert(valueUnwrapped.length); 
     }, 
     update: function (element, valueAccessor) { 
      var value = valueAccessor(); 
      var valueUnwrapped = ko.utils.unwrapObservable(value); 
      // This is always 0. 
      alert(valueUnwrapped.length); 
     } 
    }; 

    // Binding to Web Api data. 
    ko.applyBindings(new ViewModel()); 

    // Test it with static data, and custom binding works. The length displayed 2. 
    //var viewModel = { 
    // items: ko.observableArray([{name: "Bob1"}, {name: "Bob2"}]) 
    //}; 
    //ko.applyBindings(viewModel); 

}); 
</script> 
<div data-bind="testBinding: items"></div> 

답변

1

데이터가 비동기로 채워지기 때문에 (데이터 배열이 비어있을 때) 초기화는 항상 0입니다.

Test this little fiddle 

http://jsfiddle.net/SVQhR/

+0

비동기 ..

업데이트 번 0이어야하고 다음 번에 정확한 길이를 반환! Doh !!! '$ .ajaxSetup ({async : false});을 사용했습니다. 결국 문제를 해결할 수 있습니다. 고마워. –

+0

대신 http://jsfiddle.net/SVQhR/1/ – Anders

+0

처럼 데이터를로드하는 데 시간이 얼마나 걸릴지 모르겠으므로 턴 비동기를 해제하면 내 경우에 더 좋을 것이라고 생각합니다. –