dojo1.10 dijit.form.Select的动态更新

时间:2015-10-09 12:24:58

标签: dojo

我试图通过Memory和ObjectStore异步更新Select字段。这不起作用。在创建Select元素之前将数据设置为Memory对象可以正常工作。创建Select元素后更新Memory对象不再起作用。

示例代码:

require([
    "dojo/ready",

    "dijit/form/Select",
    "dojo/store/Memory",
    "dojo/store/Observable",
    "dojo/data/ObjectStore",
    'dojo/domReady!'
    ], function(ready, Select, Memory, Observable, ObjectStore, dom){
        ready(function() {
                var mymem = new Memory();
                var myobs = new Observable(mymem);
                var mystore = new ObjectStore({ objectStore: myobs });

                /* updating memory here works :) */
                //mymem.setData([ { id: 2, label: 'qwertz2' }, { id: 3, label: 'qwertz3' } ]);

                var s = new Select({
                    store: mystore
                }, 'appsAdminQueueContainer');
                s.startup();

                /* updating memory here doesn't work :( */
                mymem.setData([ { id: 2, label: 'qwertz2' }, { id: 3, label: 'qwertz3' } ]);
        });
    }
);

真实的例子:https://jsfiddle.net/mirQ/ra0dqb63/5/

这是一个错误还是有一个解决方案,可以在创建后更新Select字段的内容 - 而无需直接访问Select字段?

更新

感谢您的回复。

  • 使用dojo/ready只是一个错过的遗留物,同时简化了我的代码,抱歉。
  • 我不清楚使用ObjectStore是不是必要的。谢谢你清理。
  • 好的,真正的问题似乎确实是最后一点。我想我必须扩展我的描述。

更新/扩展的问题描述:

我正在使用网格。起初我使用dojox/grid/DataGrid,但之后我切换到dgrid。一切都运作良好,但我想使用dijit.form.Select作为一列的编辑器。如果数据是静态的,这也很有效。但在一列中,我必须从服务器读取动态数据。此数据以JSON格式提供。

首先,我尝试使用dojo/data/ItemFileReadStore来解决这个问题 - 这很有效。但它已被弃用,我需要为该列实现一个格式化程序,该格式化程序必须能够访问从服务器读取的相同JSON数据。我不再拥有该解决方案的代码,但它没有用。我无法从格式化程序函数中成功查询数据。

然后我切换到Memoryxhr。服务器的响应是在创建Memory对象之后(并且,看起来,在创建Select之后),因此我不得不使用setData将我加载的数据带入商店。由于Select只是网格的编辑器,因此我无权访问对象本身,以便在更新数据后重新设置存储。

我希望我的扩展描述能让我的真正问题更加清晰。在此先感谢您的帮助!

的Mirko

1 个答案:

答案 0 :(得分:0)

这对我有用:

SELECT Count(`r`.`review`) AS `total_reviews`,
       `c`.`company`
FROM   `reviews` AS `r`
       JOIN `companies` AS `c`
            ON `c`.`id` = `r`.`companyid` 

值得注意的变化:

  • 没有理由在此代码中使用require([ 'dijit/form/Select', 'dojo/store/Memory', 'dojo/store/Observable', ], function (Select, Memory, Observable) { var mymem = new Memory({ data: [{ id: 2, label: 'qwertz2' }, { id: 3, label: 'qwertz3' }] }); var myobs = new Observable(mymem); var s = new Select({ labelAttr: 'label', store: myobs }, 'appsAdminQueueContainer'); s.startup(); myobs.add({ id: 4, label: 'qwerty' }); }); dojo/ready回调已经等待加载模块,只要这个脚本位于正文的底部,就不需要等待DOM加载。
  • 无需使用require商店适配器。 dojo/data也支持dijit/form/Select(如果我没记错的话,则为1.8)。这也可能是观察不起作用的原因。唯一的区别是dojo/store必须在labelAttr上指定,因为Select没有标签属性的概念。
  • (编辑)现在我重新阅读了这个问题,我注意到你正在呼叫dojo/storesetData不会激怒观察者。 setData完全重置商店的数据,为了反映这一点,您需要在完全选择时实际重置商店(如果您使用1.9,则需要调用setData,而不是setStore或更早,因为Select从未正确更新以支持set('store', ...) API直到1.10)。
  • (编辑#2)鉴于您调用set的主要原因是由于在实际存储数据之前创建了商店,因此使用setData商店可能会大大简化您的案例dojo-smore的实施。它基本上会重新添加RequestMemory url支持但dojo/data/ItemFileReadStore没有支持。