這取決於您的小部件的層次結構。如果其中一個小部件是另一個小部件的子項(例如在另一個小部件的模板中使用),則可以使用data-dojo-attach-point
變量中引用的名稱來獲取您的子小部件實例,並調用其上的方法。
因此,假設父窗口部件的模板是你在你的問題張貼的HTML標記:
<div style='min-height:500px'>
<div data-dojo-type='testjs/bpl/GoogleMapWidget' data-dojo-attach-point='qWidget'></div>
</div>
這意味着你可以使用this.qWidget
訪問testjs/bpl/GoogleMapWidget
。但是,您必須從dijit/_WidgetsInTemplateMixin
繼承來做到這一點(否則,連接點僅適用於DOM節點)。因此,父控件可能看起來像這樣:
define([ "dojo/_base/declare", "dijit/_WidgetBase", "dijit/_TemplatedMixin", "dijit/_WidgetsInTemplateMixin" ], function(declare, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin) {
return declare([ _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin ], {
someMethod: function() {
this.qWidget.createMarker();
}
});
});
如果兩個部件是獨立的(無父的小工具,「控制」它們),然後調用另一個工具的最佳方法是使用dojo/topic
模塊。例如:
define([ "dojo/topic", "dojo/_base/declare", "dijit/_WidgetBase", "dijit/_TemplatedMixin" ], function(topic, declare, _WidgetBase, _TemplatedMixin) {
return declare([ _WidgetBase, _TemplatedMixin ], {
someMethod: function() {
topic.publish("/testjs/createMarker", { });
}
});
});
而其他部件則可以聽吧:
define([ "dojo/topic", "dojo/_base/declare", "dojo/_base/lang", "dijit/_WidgetBase", "dijit/_TemplatedMixin" ], function(topic, declare, lang, _WidgetBase, _TemplatedMixin) {
return declare([ _WidgetBase, _TemplatedMixin ], {
postCreate: function() {
this.inherited(arguments);
topic.subscribe("/testjs/createMarker", lang.hitch(this, this.createMarker));
}
createMarker: function() {
// Do stuff
}
});
});
這最後一種方法是偉大的,完全無關的部件通過發佈/訂閱模式相互通信(也稱爲作爲觀察者/可觀察模式)。
是否可以從widget外部訪問myWidget屬性? – erotavlas
是的,一旦你實例化小部件。 – Bucket