我正在使用KnockoutJS并通过ajax加载我的视图模型。在加载完成之前,我想显示“正在加载...”消息,如果没有加载数据,我想显示“无结果”。信息。我最初的尝试看起来像这样:
<ul data-bind="template: { name: 'mentions-template', foreach: mentions.data }">
<li data-bind="visible: mentions.loaded() && mentions.data().length < 1">No mentions</li>
<li data-bind="visible: !mentions.loaded()">Loading...</li>
</ul>
<script type="text/javascript">
var viewModel = {
mentions: {
loaded: ko.observable(false),
data: ko.observableArray()
}
}
function loadData() {
$.post(action, function(result) {
viewModel.mentions.data = ko.mapping.fromJS(result);
viewModel.mentions.loaded(true);
ko.applyBindings(viewModel);
});
}
ko.applyBindings(viewModel);
loadData();
</script>
我预计第一个li
元素只会显示viewModel.mentions.loaded
是否为假且viewModel.mentions.data
包含某些项目,而第二个li
将显示为{{ 1}}已设置为false,但两个项目始终显示。我做错了什么?
答案 0 :(得分:5)
当你的列表ul
内有这些静态项时,它们实际上并没有被绑定,因为Knockout只处理数组中的每个项目。
实现目标的一种方法是:
<ul>
<!-- ko template: { name: 'mentions-template', foreach: mentions.data } -->
<!-- /ko -->
<li data-bind="visible: mentions.loaded() && mentions.data().length < 1">No mentions</li>
<li data-bind="visible: !mentions.loaded()">Loading...</li>
</ul>
答案 1 :(得分:2)
使用visible
绑定时,我遇到了类似的意外行为问题,请尝试以下方法:
var ViewModel = {
mentions: {
loaded: ko.observable(),
data: ko.observableArray(),
status: ko.computed(function () {
if (loaded() && data().length < 1)
return 'No Mentions';
else
return 'Loading...';
});
}
使用<span>
更新您的观点:
<span data-bind="text: status, visible: loaded"></span>