dojo EdgeToEdgeList:以编程方式设置商店

dojo EdgeToEdgeList: programmatically set the store

这里是一个非常简单的 dojo 片段,但它不起作用:

require([
  "dojo/parser",
  "dojo/on",
  "dojo/dom",
  "dijit/registry",
  "dojox/mobile/EdgeToEdgeStoreList",
  "dojox/mobile/EdgeToEdgeList",
  "dojo/store/Memory",
  "dojo/domReady!"
], function(parser, on, dom, registry, EdgeToEdgeStoreList, Memory) {
  parser.parse();

  var records = [{
    deviceID: "1",
    state: "done"
  }, {
    deviceID: "2",
    state: "idle"
  }];

  var store = new Memory({
    data: records,
    idProperty: "deviceID"
  });

  registry.byId("list").setStore(store);  
});
<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.11.2/dojox/mobile/deviceTheme.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/dojo/1.11.2/dojo/dojo.js" djConfig="parseOnLoad: false, async: true"></script>
<div data-dojo-type="dojox/mobile/ScrollableView">
  <ul id="list" data-dojo-type="dojox/mobile/EdgeToEdgeStoreList" data-dojo-props="itemMap: {deviceID: 'label'}, select: ''"></ul>
</div>

未找到 list 项目。 填充商店并将其设置为列表的方式是否正确? 我的错误在哪里?

这不起作用的主要原因是 parser.parse() 也是异步的,因此您应该等待它完成。

dojo/domReady!dojo/ready 之间存在差异,在您的情况下,您实际上应该使用 dojo/ready,因为您将 parseOnLoad 配置设置为 [=17] =](查看更多here)。

现在,由于 dojo/ready 在执行代码之前自动等待所有解析调用完成,您应该有这样的东西:

parser.parse();
ready(function() {
  // put your logic in here
});

另一种选择是只注册回调:

parser.parse().then(function() {
   // put your logic here
});

最简单的方法是将 parseOnLoad 选项设置为 true,然后您可以从代码中删除 parser.parse(),其他所有内容都可以保留一样。

请注意,我在您的原始代码段中注意到的一个小错误是您的模块函数的参数中缺少 EdgeToEdgeList