ko.mapping을 사용하여 데이터를 뷰 모델로 변환하려고합니다. 결과는 웹 서비스에 대한 비동기 호출에서 비롯됩니다.
간단한보기를 다음과 같이
<div data-bind="with: myData">
<div data-bind="text: mapWidth"></div>
<div data-bind="text: mapHeight"></div>
<div data-bind="foreach: priceRanges">
<div data-bind="text: title"></div>
</div>
및 뷰 모델은 다음과 같습니다
var ViewModel = function() {
var self = this;
self.myData = null;
var data = {
action: 'GetPricePoints',
type: 'who cares'
};
$.ajax({
url: 'http://cdt.lotamore.com/api/imap',
data: { "": JSON.stringify(data) },
//async: false, // works!
async: true, // doesn't work!!!!!
type: 'post'
})
.done(function (data) {
self.myData = ko.mapping.fromJS(data);
})
.error(function (data) {
alertError(data);
})
.always(function() {
});
};
나는이 기적입니다 잘 작동 실행하면. 그러나 비동기 적으로 실행하면 내 뷰 모델 내에서 myData
을 업데이트하지 않습니다.
은 내가 여기에 바이올린을 만들었습니다 http://jsfiddle.net/jgergen/jF9pm/20/
정말 UI 스레드를 차단 아약스 통화를 할 싶지 않아! 여기서 내가 뭘 잘못하고 있니? 나는이 모든 아닙니다
self.myData = ko.observable();
:
내가 라인 변경 :
self.myData = null;
에를
감사합니다, 여기에
감사합니다, 짐 알 수 있습니다. 대답은 async가 false 일 때 ko.applyBindings를 실행할 때 myData에 값이 포함된다는 것입니다. async가 true이면 ko.applyBindings가 실행 된 후 myData가 업데이트됩니다. myData는 관찰 할 수 없기 때문에 바인딩은 null에 적용되고 비동기 호출이 완료되면 knockout은 변경 사항을 관찰 할 수 없습니다. – Paul
@ 짐 그것이 갈 방법입니다 :) –
당신이 나에게 묻는다면 생성자에서 데이터를 꺼내십시오. 초기 데이터를 가져온 후에 모델을 바인딩하는 클리너입니다. – Anders