我使用declare在Dojo中创建了Google地图小部件,其方法为createMarker
。
使用
显示地图<div style='min-height:500px'>
<div data-dojo-type='testjs/bpl/GoogleMapWidget' data-dojo-attach-point='qWidget'></div>
</div>
地图正在显示。
1)如何从另一个小部件中调用qWidget.createMarker()
?
答案 0 :(得分:1)
我不清楚你打算如何调用createMarker
,因为你没有提供另一个小部件的代码。但是,如果此小部件是模板化的,您可以使用qWidget
引用this.qWidget
。
例如,如果您的代码看起来像这样(取自here):
define([
"dojo/_base/declare",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin",
"dojo/text!./templates/SomeWidget.html"
], function(declare, _WidgetBase, _TemplatedMixin, template) {
return declare([_WidgetBase, _TemplatedMixin], {
templateString: template
});
});
SomeWidget.html
是您的HTML:
<div style='min-height:500px'>
<div data-dojo-type='testjs/bpl/GoogleMapWidget' data-dojo-attach-point='qWidget'></div>
</div>
您可以访问小部件qWidget
子句中的declare
,如下所示:
return declare([_WidgetBase, _TemplatedMixin], {
templateString: template,
myWidget: this.qWidget //reference to the widget in your template HTML
});
答案 1 :(得分:1)
这取决于您的小部件的层次结构。如果其中一个窗口小部件是另一个窗口小部件的子窗口(例如,在另一个窗口小部件的模板中使用),则可以使用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();
}
});
});
如果两个窗口小部件都是独立的(没有父窗口小部件&#34;控制&#34;它们),那么调用另一个窗口小部件的最佳方法是使用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
}
});
});
最后一种方法非常适合完全不相关的小部件通过发布者/订阅者模式(也称为观察者/可观察模式)相互通信。