【发布时间】:2017-07-22 20:21:38
【问题描述】:
总结:我有一个可观察的控制加载页面元素,该元素在长时间运行的查询期间隐藏所有内容。即使在查询之前更改了 observable,加载页面也不会显示。放置一个占位符 setTimeout 有效,但页面似乎在等待查询运行以更新页面。
编辑 3:我应该提到我在 Node.js 中这样做。
Edit2:我想要发生的事情:
1) 用户点击按钮。
2) 载入画面覆盖表格。
3) 计算运行
4) 加载屏幕消失,表格填充结果
目前正在发生的事情:
1) 用户点击按钮。
2) 计算运行时屏幕会冻结 3-4 秒。
3) 表格中填充了结果
说明我们的页面上有几个运行时间较长的查询(大约需要 3-4 秒),我们希望设置一个加载屏幕来隐藏控件并通知人们该页面正在运行。
这是我写的一个扩展器(在互联网的帮助下):
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)
}
我也尝试了几种异步方法,但我对此没有很好的理解。那么,如何使加载页面在查询运行之前出现,然后在查询完成后消失呢?谢谢。
编辑: 对我们的搜索功能有一些要求。它看起来像这样(我们没有使用 Ajax)
this.search = async _ => {
//bunch of filters/calculations on large arrays
this.results(the results of our large calculations)
}
【问题讨论】:
-
您是否使用 ajax 进行查询?如果可以,你可以在 beforesend ajax 方法中设置它吗?
-
只说“……不行”有点太笼统了,冷你请提炼?如果您使用的是 ajax,请提供您的异步方法的代码。
-
感谢大家的快速回复:不,我们没有使用 Ajax,我有一个 Javascript 函数可以进行一些计算。 (我不确定正确的术语是什么)。计算运行大约需要 3-4 秒。它看起来像
this.search = _ => { //bunch of filters on large arrays //calculations //set some observableArray values }
标签: javascript node.js asynchronous knockout.js loading