Как вызвать метод виджета додзё из другого виджета додзё?

Я создал виджет карты Google в Dojo с помощью объявления, у которого есть метод createMarker.

Карта показана с помощью

<div style='min-height:500px'>  
<div data-dojo-type='testjs/bpl/GoogleMapWidget' data-dojo-attach-point='qWidget'></div>
</div>

Карта начинает отображаться.

1) Как вызвать qWidget.createMarker() из другого виджета?


person user3467346    schedule 06.05.2014    source источник


Ответы (2)


Мне непонятно, как именно вы хотите вызвать createMarker, так как вы не предоставили код другого виджета. Однако, если этот виджет создан по шаблону, вы можете сослаться на qWidget с помощью this.qWidget.

Например, если ваш код выглядит так (взято из здесь):

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
});
person Bucket    schedule 06.05.2014
comment
можно ли получить доступ к свойству myWidget из-за пределов виджета? - person erotavlas; 27.05.2016
comment
Да, как только вы создадите экземпляр виджета. - person Bucket; 02.06.2016

Это зависит от того, какая иерархия у ваших виджетов. Если один из виджетов является дочерним по отношению к другому (например, используется в шаблоне другого), вы можете использовать имя, указанное в переменной 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