【问题标题】:dojo dgrid with store from url (json data) reload/refresh button带有来自 url(json 数据)的存储的 dojo dgrid 重新加载/刷新按钮
【发布时间】:2015-04-29 05:38:24
【问题描述】:

首先,我使用的是 dojo 1.1.0 和 dgrid 0.4.0。我正在创建一个带有一些 dgrids 的页面。一个网格特别需要从 url 加载 JSON 数据并显示它。它目前可以很好地使用 RequestMemory 存储。然而,这是一个“记忆”存储。虽然这对其他一些人来说可能是微不足道的,但我需要找到一种方法来加载数据,因为它现在正在完成,然后在屏幕上添加一个刷新按钮,调用必要的函数/方法来从 url 重新加载数据和重新填充 dgrid。

JSON 数据来自格式如下的 url:

[{"id":1,"name":"trans1","username":"trans1","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":true},{"id":2,"name":"trans2","username":"trans2","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":true},{"id":3,"name":"trans3","username":"trans3","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":4,"name":"trans4","username":"trans4","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":5,"name":"trans5","username":"trans5","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":6,"name":"trans6","username":"trans6","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false}]

您将在下面看到的 Require 实际上包含的不仅仅是这个网格......因此还有所有额外内容。

我不需要更新本地商店,也不想监视 url 的变化。我只是希望能够根据需要从 url 重新加载数据。

这是我目前用于初始加载网格(工作)的代码和我需要开始工作的刷新按钮。

require([ 'dojo/store/Observable' ,'dijit/Dialog', 'dijit/form/Select', 'dijit/form/MultiSelect', 'dijit/form/TextBox', 'dijit/layout/TabContainer', 'dijit/layout/ContentPane','dojo/request', 'dojo/request/xhr', 'dijit/form/ToggleButton', 'dijit/form/Button', 'dojo/parser', 'dojo/_base/declare', 'dgrid/Grid', 'dgrid/Selection', 'dgrid/Editor', 'dgrid/extensions/ColumnHider', 'dgrid/extensions/Pagination', 'dstore/RequestMemory', 'dijit/form/Select', 'dijit/registry','dojox/data/XmlStore', 'dojo/domReady!'], function (Observable, Dialog, Select, MultiSelect, TextBox, TabContainer, ContentPane, request, xhr, ToggleButton, Button, parser, declare, Grid, Selection, Editor, ColumnHider, Pagination, RequestMemory, Select, registry, XmlStore) {


//workers dgrid
    var workersStore = new RequestMemory({ target: '/autoAssign/getWorkers.aa?TASKTYPE=transport&INACTIVE=FALSE' });        
    var workerGrid = new (declare([ Grid, Selection, Pagination, Editor, ColumnHider ]))({
        collection: workersStore,
        className: 'dgrid-autoheight',
        id: 'workerGrid',
        rowsPerPage: 6,
        columns: {
            name: 'Name',
            username: {
                label: 'username',
                hidden: true
            },
            status: 'Status',
            assignedNum: 'Assigned',
            completedNum: 'Completed',
            avgTime: 'Average',
            aaOn: {
		      label: 'Auto Assign',
		      editor: 'checkbox',
                  }
        }
    }, 'gridNode');
    workerGrid.on("dgrid-datachange",function(evt) {
       var row = workerGrid.row(evt); 
       if (evt.cell.column.id == 'aaOn') {
           var promise = request('/autoAssign/setUserAaStatus.aa?USERNAME='+row.data.username+'&TASKTYPE=transport&STATUS='+evt.value);
       }
    });
    workerGrid.startup();


//Add refresh Button
      var addRefreshButton = new Button({
        label: "Refresh",
        style: 'float:right;',
        onClick: function(){
           var promise = workersStore.fetch();
           var result = promise.then(function(data){
               workerGrid.set("collection", workersStore);
               workerGrid.refresh();
               alert("refresh pushed");
           });
        }
    }, "refresh").startup(); 


}

[{"id":1,"name":"trans1","username":"trans1","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":true},{"id":2,"name":"trans2","username":"trans2","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":true},{"id":3,"name":"trans3","username":"trans3","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":4,"name":"trans4","username":"trans4","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":5,"name":"trans5","username":"trans5","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":6,"name":"trans6","username":"trans6","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false}]

任何帮助将不胜感激。我以前使用 Dojo 的旧数据网格执行此操作,但似乎无法理解我在这里缺少的内容。

【问题讨论】:

    标签: javascript dojo store dgrid dstore


    【解决方案1】:

    从技术上讲,为了做你想做的事,你需要以某种方式更新本地商店。 dstore/RequestMemory 本质上是dstore/Requestdstore/Cache 的组合,其中单个fetch 请求立即执行,然后缓存存储字段所有未来的提取操作。为了强制商店从服务器刷新,你基本上需要告诉商店它的缓存不再有效,然后重新向服务器请求所有物品。这相当于:

    workersStore.invalidate(); // Invalidate the cache
    workersStore.fetch(); // Perform a new request for all items
    workerGrid.refresh();
    

    一旦执行了fetchCache 存储就会明白它可以从其内存存储中提取所有请求。

    (fetch 调用很重要 - 如果您不调用上面的 fetch,您的网格可能无法按预期工作。dgrid 的 OnDemandGrid 和 Pagination 模块使用 fetchRange 执行范围查询,除非 Cache 知道它拥有商店的所有数据,它只会让这些数据通过原始商店,在这种情况下是请求,它将尝试访问服务器 - 除非您的服务可能不具备处理范围查询的能力,所以它会每次只返回整个数据集。)

    诚然,我认为这比使用 RequestMemory 的人需要知道的信息还要多,所以我可能会提交有关刷新和/或更新 target 的某种 API 的问题。上面的 3 行代码虽然是 TL;DR。

    【讨论】:

    • 更新:提交拉取请求以使这更容易:github.com/SitePen/dstore/pull/106
    • 谢谢! invalidate() 正是我所缺少的。实际上,我之前曾尝试过 fetch 然后 refresh() 网格......它表现得好像什么也没发生。这非常有效。令人惊讶的是,我已经搜索了 3 天,但在任何地方都找不到记录。
    • Ken,奇怪的是,我刚刚意识到您发布的解决方案的简单版本的一个特点。如果在 url(原始数据源)中添加了记录,则商店会使用这些记录进行更新。但是,如果从原始数据源中删除记录,则存储不会删除它们。在这两种情况下,我都希望它从 url 完全重新加载 Requestmemory 存储。关于如何使删除方案起作用的任何建议?
    • 伙计,这很好。您可以尝试在无效后立即致电workersStore.cachingStore.setData([]) 吗?如果可行,我会在我的 PR 中添加一条注释(不确定我是否真的可以将它 in 放入 PR,因为从技术上讲,我相信可以使用 Memory 以外的东西作为缓存存储)。
    • 肯,是的,做到了。再次感谢。既然您提到了另一种选择,对于我的这种情况,您建议(将来)使用什么作为商店?什么更适合从返回 JSON 的 URL 进行按需调用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    相关资源
    最近更新 更多