2013-05-08 3 views
4

KnockoutJS를 이해하려고합니다. 나는 어떤 코드를 실행하는 동안 회 전자를 원한다. 그런데 왜 회 전자는 작동 후에 만 ​​나타 납니까?knockout.js. 로딩 스피너는 작업 후에 만 ​​나타납니다.

<img data-bind="visible: isLoading" src="loading.gif"> 

<a href="#" data-bind="click: someOperation">Click</a> 

<script type="text/javascript" src="knockout-2.2.1.js"></script> 
<script> 
var ViewModel = function() { 
    var self = this; 
    self.isLoading = ko.observable(false); 
    self.someOperation = function() { 
     self.isLoading(true); 
     for(i = 0; i < 30000; i++) 
      console.log('lol'); 
     self.isLoading(false);  
    }; 
}; 

ko.applyBindings(new ViewModel()); 
</script> 

감사합니다, 표도르

답변

2

편집 : 첫 번째 대답은 틀렸다!

크롬에서 콘솔은 비동기식이며 console.log()는 예상대로 발생하지 않습니다.

setTimeout을 사용하면 문제가 없습니다. 이 바이올린보기 Fiddle

var ViewModel = function() { 
    var self = this; 
    self.isLoading = ko.observable(false); 
    self.someOperation = function() { 
     self.isLoading(true); 
     window.setTimeout(function() { self.isLoading(false) }, 1000); 
     //for(i = 0; i < 30000; i++) 
     //  console.log('lol'); 
     ///self.isLoading(false);  
    }; 
}; 

ko.applyBindings(new ViewModel()); 
+0

그것은 setTimeout과 함께 작동합니다. 하지만 console.log()에서만 작동하지 않습니다. 또한 어떤 루프에서도 작동하지 않습니다. 이 피들보기 http://jsfiddle.net/xAs5K/ – user2360833

+0

바이올린이 작동하지만 루프가 매우 빠르며 console.log가 비동기식으로 발생합니다. 즉'self.isLoading (false)'가'console.log ('lol')'이전에 발생합니다. for (i = 0; i <30000; i ++) 줄에 중단 점을 넣으면로드하는 이미지가 표시됩니다. –

+1

뭔가를하기 전에 비동기가 끝날 때까지 기다리고 싶다면 약속을 살펴보십시오. [http://documentup.com/kriskowal/q/](q.js는 좋은 도서관입니다) –

관련 문제