如何从其他dojo小部件调用dojo小部件方法?

时间:2014-05-06 10:39:04

标签: dojox.charting dojo

我使用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()

2 个答案:

答案 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
        }
    });
});

最后一种方法非常适合完全不相关的小部件通过发布者/订阅者模式(也称为观察者/可观察模式)相互通信。