2015-05-14 5 views
0

У меня есть раздел моей страницы, связанный с моделью просмотра нокаутов. Когда я нажимаю ссылку, он загружает некоторые данные и отображает их немного дальше. Я хочу показать небольшую загрузку img, пока она гаснет, и загружает данные, а затем скрывает их, когда они завершены. У меня есть следующий код (урезанный, чтобы показать важные части). Вызов Ajax равен NOT async, для него был установлен false для другого кода, который использует кто-то другой, поэтому я не могу его изменить. Проблема заключается в том, что «self.Loading (false)» не запускается до тех пор, пока вызов ajax не будет завершен, поэтому он вообще не появляется. Если я переключу вызов ajax на async, он будет работать по назначению. Поэтому мне интересно, почему вызов Ajax блокирует изменение наблюдаемых, так как он вызывается перед ним, не следует немедленно его запускать. Есть ли способ заставить его немедленно запускать.Сделать нокаут наблюдаемым применить немедленно?

HTML:

<a data-bind="click: GetInfo" href="javascript:;"> 
    <img data-bind="visible: Loading" src="myimg.jpg" alt="Loading" /> 
</a> 

KO:

self.Loading = ko.observable(false); 
self.GetInfo = function() { 
    self.Loading(true); 
    AjaxCall().done(function (data){ 
     self.Loading(false); 
    } 
}; 
+0

Так же, как анекдот, в последний раз, когда я видел веб-приложение, которое было построено на не-async XHR, оно было труднопроизносимым и должно было быть перезаписано с нуля. –

ответ

3

Наблюдаемая и DOM, вероятно, обновляется сразу, но вы не можете видеть, потому что браузер, вероятно, не обходит чертеж экрана. Запрос блокирует перерисовку, потому что ... это не async. Это точная причина, по которой вы должны не делать неасинхронные запросы.

В качестве обходного пути вы можете попытаться заставить цикл цикла вращаться один раз, используя setTimeout с таймаутом 0, чтобы запустить ваш ужасный запрос синхронизации после наблюдаемого изменения, но со всей серьезностью просто исправьте свой запрос как асинхронный. Браузеры не гарантируют что-либо (включая запуск любых анимаций загрузки), когда ваш код блокируется.

+0

Спасибо, да, я лично не поклонник запросов синхронизации, я считаю, что он был настроен изначально, чтобы получить привязку к нокауту, чтобы ждать, пока данные не будут загружены, потому что они не привязывались ни к чему, а затем меняли вызывающие странные мерцания, но эта проблема легче исправить, чем этот. Никогда не знал, что синхронизация заблокировала перерисовку, подумав, что она просто заблокировала ваш код верхнего уровня. Я посмотрю, возможно ли изменить его. – DasBeasto

0

Попробуйте

<a data-bind="click: GetInfo,valueUpdate: 'keyup'" href="javascript:;"> 
    <img data-bind="visible: Loading" src="myimg.jpg" alt="Loading" /> 
</a> 
+1

wtf does valueUpdate имеет отношение к событиям щелчка –

+0

Ради полноты я попробовал, и это действительно не работает, спасибо. – DasBeasto

Смежные вопросы