将信息从一个Dojo AMD模块传递到另一个

时间:2012-11-04 03:07:29

标签: ajax json dojo amd

我正在玩Dojo 1.8中的模块,我有一个像这样定义的模块:

define(["dojo/request/xhr", "dojo/json"],
  function(xhr, JSON) {

  var url = "server/provider.php";

  return {
    files: {},

    getDirList: function() {
      var self = this;
      xhr(url).then(function(response) {
        response = JSON.parse(response);
        // would love to return the JSON for use here
      }, function(err) {
        console.error(err);
      });
    }
  };

});

我有另一个模块,我喜欢称之为该方法,然后使用它:

define(["dojo/dom",
        "dojo/dom-construct",
        "dojo/_base/array",
        "afm/utils"
        ],
function(dom,domConst,array, utils) {
  return {
    produceHtml: function() {
      var json = utils.getDirList(); //this returns undefined
      var dirLength = json.length;
      console.log(json);
      for (var i = 0; i < json.length; i++) {
        if(i % 2 === 0) {
          domConst.place('<tr class="even"><td>' + json[i].name + '</td></tr>', 'output');
        } else {
          domConst.place('<tr><td>' + json[i].name + '</td></tr>', 'output');
        }
      }

    }
  };
});

当然,我可以将DOM创建代码放入到util模块中,但这就是将视图逻辑混合到不应该的地方。如果我想重用util.getDirList方法,那就太可怕了。

如何使用该方法返回的JSON?还有其他人这样做吗?

2 个答案:

答案 0 :(得分:1)

dojo / request / xhr调用的结果是异步进行的,因此只有在返回后才能设置响应参数。 你想要的是返回一个Promise(在这里阅读:http://dojotoolkit.org/documentation/tutorials/1.8/promises/)。

但首先:您可以让dojo / request为您解析json数据,如下所示:

require(['dojo/request'],function(request) {
    request.get('http://example.com/data.json', {handleAs:'json'}).then(...)
})

见这里:http://dojotoolkit.org/reference-guide/1.8/dojo/request.html#dojo-request

现在结合这个,你的getDirList函数可以只是:

getDirList: function() {
    return xhr.get(url, {handleAs:'json'});
}

然后在你的produceHtml中你会做这样的事情:

utils.getDirList.then(function(json) {
    for (var i = 0; i < json.length; i++) {
    if(i % 2 === 0) {
      domConst.place('<tr class="even"><td>' + json[i].name + '</td></tr>', 'output');
    } else {
      domConst.place('<tr><td>' + json[i].name + '</td></tr>', 'output');
    }
});

答案 1 :(得分:0)

在你的第二个模块中,不应该

define(["dojo/dom",
        "dojo/dom-construct",
        "dojo/_base/array",
        "afm/utils"
        ],
function(dom,domConst,array) {

成为

define(["dojo/dom",
        "dojo/dom-construct",
        "dojo/_base/array",
        "afm/utils"
        ],
function(dom,domConst,array, utils) {