在Dojo中交换AMD模块依赖项

时间:2014-08-12 03:40:27

标签: dojo requirejs amd

这是在MyWidget.js模块中声明的窗口小部件类。

define(["dojo/Foo","myapp/Bar"], function(Foo, Bar) { return declare('MyWidget', [], {
   postCreate:function() {
      var bar = new Bar();
      bar.sayHello();
   }
})});

在这个理论示例中,“myapp / Bar”是通过返回声明调用类似地定义的类。现在让我们假设我通过扩展“myapp / Bar”创建了“myapp / SpecialBar”。

在另一个小部件中,我想告诉MyWidget使用“myapp / SpecialBar”而不是“myapp / Bar”,如下所示:

require(["myapp/MyWidget","myapp/SpecialBar"], function(Foo, SpecialBar) { 
   //Now swap "myapp/Bar" module dependency of "myapp/MyWidget" to "myapp/SpecialBar"
   var myWidget = new MyWidget();
});

我知道如何做到这一点。例如,我可以将一个Bar属性添加到“myapp / MyWidget”并分配Bar模块的值。这将允许我像这样实例化:new MyWidget({ Bar:SpecialBar })。然而,这似乎太多的仪式。有没有一种干净的方法可以在不对模块定义进行任何特殊处理的情况下交换AMD依赖?

1 个答案:

答案 0 :(得分:1)

这是干净的方式。您无法更改窗口小部件/模块所依赖的模块,您可以映射它们,但这是全局完成的,因此它始终映射到特定模块。

如果你能做到这一点,你也可以打破很多东西,此外,任何语言都不存在这样的功能。将require()与Java和.NET中的导入进行比较,您将看到类似的趋势。

更改模块的唯一方法是更改​​模块的行为/状态,这意味着通过覆盖属性或功能。当模块是“可交换的”时,它通常用作属性,例如发生这种情况:

  • dojo/dnd/Moveable类允许您通过dojo/dnd/Mover属性设置自定义mover。在这种情况下,构造函数作为属性添加到Moveable(reference guide
  • 所有带有下拉列表的小部件都继承自dijit/_HasDropDown,它将下拉小部件本身作为属性添加到父小部件