Knockout:在等待查询完成时加载页面
Knockout: Loading Page While Waiting for a Query to Finish
总结:我有一个 observable 控制加载页面元素,该元素在长时间 运行ning 查询期间隐藏所有内容。即使在查询之前更改了 observable,加载页面也不会显示。放置占位符 setTimeout 有效,但页面似乎在等待查询 运行 更新页面。
编辑 3:我应该提到我在 Node.js 中这样做。
Edit2:我想要发生的事情:
1) 用户点击按钮。
2) 加载屏幕覆盖 table.
3) 计算运行
4) 加载屏幕消失,table 填充结果
当前发生的事情:
1) 用户点击按钮。
2) 屏幕在计算时冻结 3-4 秒 运行.
3) Table 填充了结果
说明 我们的页面上有几个很长的 运行ning 查询(大约需要 3-4 秒),我们想放置一个加载屏幕以隐藏控件并通知人们该页面是 运行ning.
这是我写的扩展器(在互联网的一些帮助下):
ko.bindingHandlers.Loading = {
init: function (element) {
$(element).append("<div id='loading_wrap' class='loader' style='height:100%; width:100%;text-align:center; margin-top: 20%'><img src='./resources/ajax-loader.gif'><br>Loading, please wait.</div>")
},
update: function (element, valueAccessor) {
var isLoading = ko.utils.unwrapObservable(valueAccessor());
var $element = $(element);
var $children = $element.children(':not(.loader)');
var $loader = $(element).find('.loader');
if (isLoading) {
$children.hide();
$loader.show();
} else {
$children.show();
$loader.hide();
}
}
我将 bindingHandler 附加到 div,其中包含我想隐藏的结果:
<div class="row table__row" data-bind="Loading:isLoading">
我在 运行 查询之前设置了 this.isLoading(true),然后在查询之后将其设置回 false。以下内容不起作用:
this.load = _ => {
var _self = this
this.isLoading(true)
this.search()
this.isLoading(false)
}
但是,如果我设置超时,加载页面会正常显示。
this.load = _ => {
var _self = this
this.isLoading(true)
setTimeout(function () {
_self.isLoading(false);
}, 3000)
}
我也尝试过几种异步方法,但我对此不是很了解。那么,如何让加载页面出现在查询 运行s 之前,然后在查询完成后消失呢?谢谢。
编辑:
收到一些对我们的搜索功能的请求。它看起来像这样(我们没有使用 Ajax)
this.search = async _ => {
//bunch of filters/calculations on large arrays
this.results(the results of our large calculations)
}
使用绑定处理程序并不是绝对必要的,因为您只能在一个方向上执行操作。
保持简单:
this.isLoading.subscribe(function(value) {
... get elements
$children.toggle(!value);
$loader.show(value);
});
在你发表评论之后,我相信你需要的只是稍微 post 完成你漫长的 运行 工作,在显示加载微调器之后,类似这样的事情:
this.isLoading(true);
setTimeout(function () {
this.search();
this.isLoading(false);
}, 100);
关于 promises 和异步代码之间的区别,post 有一个很好的例子:
顺便说一句,这里是 extenders and here for binding handlers.
的 Knockout 参考资料
总结:我有一个 observable 控制加载页面元素,该元素在长时间 运行ning 查询期间隐藏所有内容。即使在查询之前更改了 observable,加载页面也不会显示。放置占位符 setTimeout 有效,但页面似乎在等待查询 运行 更新页面。
编辑 3:我应该提到我在 Node.js 中这样做。
Edit2:我想要发生的事情:
1) 用户点击按钮。
2) 加载屏幕覆盖 table.
3) 计算运行
4) 加载屏幕消失,table 填充结果
当前发生的事情:
1) 用户点击按钮。
2) 屏幕在计算时冻结 3-4 秒 运行.
3) Table 填充了结果
说明 我们的页面上有几个很长的 运行ning 查询(大约需要 3-4 秒),我们想放置一个加载屏幕以隐藏控件并通知人们该页面是 运行ning.
这是我写的扩展器(在互联网的一些帮助下):
ko.bindingHandlers.Loading = {
init: function (element) {
$(element).append("<div id='loading_wrap' class='loader' style='height:100%; width:100%;text-align:center; margin-top: 20%'><img src='./resources/ajax-loader.gif'><br>Loading, please wait.</div>")
},
update: function (element, valueAccessor) {
var isLoading = ko.utils.unwrapObservable(valueAccessor());
var $element = $(element);
var $children = $element.children(':not(.loader)');
var $loader = $(element).find('.loader');
if (isLoading) {
$children.hide();
$loader.show();
} else {
$children.show();
$loader.hide();
}
}
我将 bindingHandler 附加到 div,其中包含我想隐藏的结果:
<div class="row table__row" data-bind="Loading:isLoading">
我在 运行 查询之前设置了 this.isLoading(true),然后在查询之后将其设置回 false。以下内容不起作用:
this.load = _ => {
var _self = this
this.isLoading(true)
this.search()
this.isLoading(false)
}
但是,如果我设置超时,加载页面会正常显示。
this.load = _ => {
var _self = this
this.isLoading(true)
setTimeout(function () {
_self.isLoading(false);
}, 3000)
}
我也尝试过几种异步方法,但我对此不是很了解。那么,如何让加载页面出现在查询 运行s 之前,然后在查询完成后消失呢?谢谢。
编辑: 收到一些对我们的搜索功能的请求。它看起来像这样(我们没有使用 Ajax)
this.search = async _ => {
//bunch of filters/calculations on large arrays
this.results(the results of our large calculations)
}
使用绑定处理程序并不是绝对必要的,因为您只能在一个方向上执行操作。
保持简单:
this.isLoading.subscribe(function(value) {
... get elements
$children.toggle(!value);
$loader.show(value);
});
在你发表评论之后,我相信你需要的只是稍微 post 完成你漫长的 运行 工作,在显示加载微调器之后,类似这样的事情:
this.isLoading(true);
setTimeout(function () {
this.search();
this.isLoading(false);
}, 100);
关于 promises 和异步代码之间的区别,post 有一个很好的例子:
顺便说一句,这里是 extenders and here for binding handlers.
的 Knockout 参考资料