我需要在執行後臺任務(使用JQuery promise)時顯示加載gif。我有大部分代碼,但是我的問題如下:Knockout.js:如何在完成異步調用時顯示加載圖像
問題:加載gif顯示在數據準備好顯示時,這違背了使用加載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>
謝謝Rohith Nair的幫助。我給你一個投票。如何在開始時顯示加載gif?正如我在文章中提到的那樣,gif正在顯示,就像數據準備好顯示一樣。 – user1309226 2014-10-30 11:32:37
@ user1309226我已更新答案 – 2014-10-30 12:10:04
完美無缺! – user1309226 2014-10-30 19:52:36