【问题标题】:Swap an AMD Module Dependency in Dojo在 Dojo 中交换 AMD 模块依赖项
【发布时间】:2014-08-12 18:17:09
【问题描述】:

这是在 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 依赖项而不对模块定义进行任何特殊处理?

【问题讨论】:

    标签: dojo requirejs amd


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 好的。那时我的想法是对的。问题是我必须预测将来哪个模块可能是“可交换的”。这不是AMD的缺陷还是我看错了?任意更改依赖绑定通常很有用,尤其是对于单元测试。使用这种方法,我不仅需要每个依赖项,而且我还必须对将来可能需要不同绑定的那些进行特殊处理。我希望我可以避免这种复杂性。
    • 对于单元测试,您可以映射模块,在这个答案中更详细地解释:stackoverflow.com/questions/16324900/…
    猜你喜欢
    • 2013-06-10
    • 2014-10-08
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    相关资源
    最近更新 更多