首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >敲除:在等待查询完成时加载页面

敲除:在等待查询完成时加载页面
EN

Stack Overflow用户
提问于 2017-07-22 20:21:38
回答 1查看 1.1K关注 0票数 0

摘要:我有一个可观察到的控制加载页面元素的控件,该元素在长时间运行的查询中隐藏所有内容。即使在查询之前更改了可观察到的内容,加载页面也不会显示。放置占位符setTimeout有效,但是页面似乎要等待查询运行才能更新页面。

编辑3:我应该提到我是用Node.js来做这个的。

Edit2:我想要发生的事:

1)用户点击按钮。

2)加载屏幕覆盖表。

3)运行的计算

4)加载屏幕消失,表中填充结果

目前正在发生的情况:

1)用户点击按钮。

2)计算运行时屏幕冻结3-4秒。

3)表中填充了结果

说明我们的页面上有几个长时间运行的查询(大约需要3-4秒),我们希望设置一个加载屏幕来隐藏控件,并通知用户页面正在运行。

下面是我写的一个扩展程序(在互联网的帮助下):

代码语言:javascript
复制
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中,直到它们准备好为止:

代码语言:javascript
复制
<div class="row table__row" data-bind="Loading:isLoading">

我在运行查询之前设置了this.isLoading(true),然后在查询后将其设置为false。以下内容不起作用:

代码语言:javascript
复制
this.load =  _ => {
        var _self = this
        this.isLoading(true)
        this.search()
        this.isLoading(false)
    }

但是,如果我输入了一个超时,则加载页将正确显示。

代码语言:javascript
复制
this.load = _ => {
        var _self = this
        this.isLoading(true)
        setTimeout(function () {
            _self.isLoading(false);
        }, 3000)
    }

我也尝试过几种异步方法,但我对此没有很好的理解。那么,如何使加载页在查询运行之前出现,然后在查询完成后消失呢?谢谢。

编辑:有一些要求我们的搜索功能。它看起来像这样(我们不使用Ajax)

代码语言:javascript
复制
this.search = async _ => {
//bunch of filters/calculations on large arrays
this.results(the results of our large calculations)
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-22 20:31:11

使用绑定处理程序并不是绝对必要的,因为您只有一个方向的操作。

保持简单:

代码语言:javascript
复制
this.isLoading.subscribe(function(value) {
  ... get elements
  $children.toggle(!value);
  $loader.show(value);
});

在您发表意见之后,我相信您需要的只是稍微推迟您长期运行的工作,在加载旋转器显示之后,这样的情况如下:

代码语言:javascript
复制
    this.isLoading(true);
    setTimeout(function () {
        this.search();
        this.isLoading(false);
    }, 100);

这里有一篇关于承诺和异步代码之间的区别的文章:https://stackoverflow.com/a/20930199/4845566

顺便说一句,这里是扩展器绑定处理程序的淘汰赛引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45258843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档