【发布时间】:2014-08-21 16:31:36
【问题描述】:
我有一个购物车。当它为空时,我想显示一个带有“空”消息的 div。当其中有项目时,我想显示一个包含项目的 div。目前,我有这样的东西......
<div style="display: none" data-bind="visible: items().length == 0">Empty</div>
<div style="display: none" data-bind="visible: items().length > 0">Not Empty</div>
...还有这个...
function ViewModel() {
var self = this;
self.items = ko.observableArray([]);
};
现在,我正在使用 AJAX 加载商品,这意味着对于购物车中是否有商品存在一个初始阶段的不确定性。这意味着页面从显示“空”div 开始,然后很快,在看到有项目后,将其替换为“非空”div——这个过程在屏幕上看起来很笨重。
如何在我的 AJAX 完成并且我知道项目数之前暂停 div 上的 visible 函数?
我想到的一件事(看到工作here)是创建一个单独的属性showEmpty...
<div style="display: none" data-bind="visible: showEmpty">Empty</div>
<div style="display: none" data-bind="visible: items().length > 0">Not Empty</div>
...并默认将其设置为undefined。这意味着 visible 在定义 showEmpty 之前不会解析。然后我在 AJAX 调用中定义它...
self.items = ko.observableArray([]);
self.showEmpty = ko.observable(undefined);
// Fake AJAX
setTimeout(function() {
self.items([1]);
self.showEmpty(self.items().length == 0);
}, 2000);
这 100% 有效,但它提出了一个新问题:我现在 手动 更新一个 observable。如下所示,当我想在数组中添加或删除项目时,这些函数现在必须担心更新showEmpty 属性。
self.addItem = function() {
self.items.push(1);
self.showEmpty(false);
};
self.removeItem = function() {
self.items.pop();
self.showEmpty(self.items().length == 0);
};
我觉得 KO 的全部目的是避免这种事情。那么,我想要的是某种方法来设置 only 对 div 的 visible 函数的分辨率的初始延迟。在最初的等待之后,我希望 visible 函数根据可观察数组的 .length 进行更新。
谢谢!
【问题讨论】:
-
您可以编写自己的绑定或使用动画类。
-
或者只使用第二个名为 Loading 的变量,将其设置为 true,然后将 ajax 的末尾设置为 false。然后只需将该变量包含在任何一方的显示要求中即可。