Dojo没有加载模块强制使用require

时间:2014-01-17 16:58:44

标签: module dojo amd

我正在几个不同的小部件中加载一个实用程序模块。这个模块只包含一堆像这样的DOM事件:

openPointPicker: function() {
        fx.animateProperty({
          node:"point-picker",
          properties: {
            top: { end: 60, start:-500 }
          }
        }).play();
        domClass.add("point-picker", "menu-open");
      },
      closePointPicker: function() {
        fx.animateProperty({
          node:"point-picker",
          properties: {
            top: { end: -500, start:60 }
          }
        }).play();
        domClass.remove("point-picker", "menu-open");
      },

我在我的应用程序中使用它,它总是加载得很好。除一例外。我有一个需要使用它的小部件,所以我创建了它:

define([
  "dojo/_base/declare",
  "dijit/_WidgetBase",
  "dijit/_TemplatedMixin",
  "dojo/text!./templates/PMS.html",
  "dojo/dom-construct",
  "app/menus", //this loads in plenty of other widgets and files, but not here
  "dojo/domReady!"
],
  function(declare, _WidgetBase, _TemplatedMixin, template, domConstruct, menus) {

    return declare("PMS",[_WidgetBase, _TemplatedMixin], {
        templateString: template,
        widgetsInTemplate: true,
        symbol:null,
        layer:null,

        constructor: function() {
          console.log(menus); //empty object
        },
        postMixInProperties: function() {

        },
        postCreate: function() {

        },
        chooseLocation: function() {
          menus.openPointPicker();
          var handle = topic.subscribe('location-picked', function(locationInfo) {
            //stuff 
            handle.remove();
          });
        }

      }
    );
  });

当尝试触发'chooseLocation'方法时,它调用menus.openPointPicker();那失败了:

Uncaught TypeError: Object #<Object> has no method 'openPointPicker'

现在,我能做的是特别要求“app / menus”这样:

chooseLocation: function() {
      require(["app/menus"], function(menus) {
        menus.openPointPicker();
        var handle = topic.subscribe('location-picked', function(locationInfo) {
          // some other stuff
          handle.remove();
        });
      });


    }

但为什么这是必要的?我不需要在使用此模块的任何其他小部件中执行此操作。我很困惑。

编辑:情节肯定会变厚。我将menus.js模块复制到menus2.js。我在我的模块列表中更改了它以加载。现在加载就好了。我显然不能有2个文件做同样的事情,但看起来这不是我做错了。看起来像Dojo AMD加载器中的某种错误。

最终编辑:看起来我的menus.js模块中有一个循环引用。我的menus2.js测试文件中有相同的引用,所以我不知道为什么会这样。但无论如何,它都被重构了。

0 个答案:

没有答案