Мне нужно отобразить gif загрузки, в то время как фоновая задача (с использованием обещаний JQuery выполняется). У меня есть большая часть кода, но моя проблема заключается в следующем:Knockout.js: Как отображать загружаемое изображение при завершении асинхронного вызова
Задача: загрузочный экран отображается, когда данные готовы к отображению, что приводит к потере цели использования gif загрузки! Как отобразить gif прямо в начале и затем удалить его после того, как данные будут готовы для отображения.
Я использую специальный обработчик привязки KO с наблюдаемым флагом.
Вы можете увидеть код в этом jsfiddle
JavaScript:
ko.bindingHandlers.loadingList = {
init: function (element, valueAccessor) {
ko.utils.unwrapObservable(valueAccessor());
if (valueAccessor() == true) {
$(element).wrap($('<div>', {
"class": "loading"
}));
$(element).before($('<div>', {
"class": "loading_inner"
}));
} else {
$(element).parent().replaceWith($(element));
}
},
update: function (element, valueAccessor, allBindingsAccessor) {
ko.utils.unwrapObservable(valueAccessor());
if (valueAccessor() == true) {
$(element).wrap($('<div>', {
"class": "loading"
}));
$(element).before($('<div>', {
"class": "loading_inner"
}));
} else {
$(element).parent().replaceWith($(element));
}
}
};
function PersonViewModel(callback) {
var self = this;
self.InProgress = ko.observable(true);
self.persons = ko.observableArray([]);
// Get available audits
var promises = [];
promises.push(GetPersons());
$.when.apply($, promises).then(function() {
self.persons(arguments[0]);
self.InProgress(false);
});
}
ko.applyBindings(new PersonViewModel());
function GetPersons() {
var dfrd = $.Deferred();
var result = [{
Name: 'John Smith',
Country: 'USA'
}, {
Name: 'Juan Carlos',
Country: 'Spain'
}];
setTimeout(function() {
dfrd.resolve(result)
}, 3000);
return dfrd;
}
HTML:
<div class="container">
<h1>Persons</h1>
<hr />
<table data-bind="foreach: persons, loadingList:InProgress()">
<thead>
<tr>
<th><span>Name</span>
</th>
<th><span>Country</span>
</th>
</tr>
</thead>
<tbody>
<tr>
<td><span data-bind="text:Name"></span>
</td>
<td><span data-bind="text:Country"></span>
</td>
</tr>
<td>
</table>
</div>
Спасибо, Рохит Наир за вашу помощь. Я даю вам предварительный голос. Как показать загрузку gif в начале? Как я упоминал в своем посте, gif отображается так же, как и данные, готовые для отображения. – user1309226
@ user1309226 Я обновил ответ –
Работает отлично! – user1309226