Это зависит от того, какая иерархия у ваших виджетов. Если один из виджетов является дочерним по отношению к другому (например, используется в шаблоне другого), вы можете использовать имя, указанное в переменной data-dojo-attach-point
, чтобы получить экземпляр дочернего виджета и вызвать методы для него.
Итак, если предположить, что шаблон родительского виджета представляет собой HTML-разметку, которую вы разместили в своем вопросе:
<div style='min-height:500px'>
<div data-dojo-type='testjs/bpl/GoogleMapWidget' data-dojo-attach-point='qWidget'></div>
</div>
Это означает, что вы можете получить доступ к testjs/bpl/GoogleMapWidget
, используя this.qWidget
. Однако для этого вам нужно наследовать от 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
}
});
});
Этот последний подход отлично подходит для совершенно несвязанных виджетов, которые взаимодействуют друг с другом через шаблон издатель/подписчик (также известный как шаблон наблюдатель/наблюдаемый).
person
g00glen00b
schedule
06.05.2014