Javascript 如何从Dojo声明性小部件访问局部变量

Javascript 如何从Dojo声明性小部件访问局部变量,javascript,dojo,Javascript,Dojo,我在自定义小部件中有一个声明性Dijit日历,我希望从数据dojo道具中访问非全局变量,而不需要引用全局变量 myWidgetTemplate.html: 但这仅仅是因为我碰巧在一个小部件模板中工作。是否可以从页面中的声明性小部件引用另一个模块中的变量/函数?我希望能够做到这样: data-dojo-props="isDisabledDate: uiModule.myIsDisabledDate" 如何才能做到这一点?声明性小部件只能访问全局范围,因为它位于DOM的全局范围内。您需要的所有其他

我在自定义小部件中有一个声明性Dijit日历,我希望从数据dojo道具中访问非全局变量,而不需要引用全局变量

myWidgetTemplate.html:

但这仅仅是因为我碰巧在一个小部件模板中工作。是否可以从页面中的声明性小部件引用另一个模块中的变量/函数?我希望能够做到这样:

data-dojo-props="isDisabledDate: uiModule.myIsDisabledDate"

如何才能做到这一点?

声明性小部件只能访问全局范围,因为它位于DOM的全局范围内。您需要的所有其他模块通常位于require块中,该块有自己的作用域

因此,从声明性小部件中的另一个模块访问属性的唯一方法是将该模块添加到全局范围

编程的 例如:

define("uiModule", {
    title: "Some title"    
});

require(["uiModule", "dijit/form/Button", "dojo/parser"], function(uiModule) {
    window.uiModule = uiModule;   
});
<button data-dojo-type="dijit/form/Button"
    data-dojo-props="label: btn.uiModule.title" id="btn">

    <script type="dojo/require">
      "btn.uiModule": "uiModule"
    </script>
然后你可以做:

声明的 或者,您可以使用声明性标记将其缩短:

uiModule:uiModule 这仍然意味着uiModule仍然添加到全局范围。但是,如果创建声明性小部件,则该实例在全局范围内始终可用,例如,如果创建ID为btn的按钮,则可以使用window.btn访问该按钮。您可以使用该功能将uiModule添加到按钮本身,例如:

define("uiModule", {
    title: "Some title"    
});

require(["uiModule", "dijit/form/Button", "dojo/parser"], function(uiModule) {
    window.uiModule = uiModule;   
});
<button data-dojo-type="dijit/form/Button"
    data-dojo-props="label: btn.uiModule.title" id="btn">

    <script type="dojo/require">
      "btn.uiModule": "uiModule"
    </script>
我将这三个例子组合成一把小提琴,演示了它们: