KnockoutJS - 显示加载而没有数据消息

时间:2012-07-20 20:00:51

标签: knockout.js

我正在使用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,但两个项目始终显示。我做错了什么?

2 个答案:

答案 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>

示例:http://jsfiddle.net/rniemeyer/gw7bM/

答案 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>