Проблема с dojo, подтверждают виджет диалога, вызванный из jsp - PullRequest
0 голосов
/ 18 января 2019

У меня есть следующий виджет:

FruitWidget.html

<div data-dojo-type="dijit/ConfirmDialog"
 data-dojo-attach-point="fruitWarningDialog"
 data-dojo-props="title:'Timeout Warning'"
 data-dojo-attach-event="execute:printTimeout">
        Press ok to print something!
</div>

FruitWidget.js

define([
"dojo/_base/declare",
"dijit/ConfirmDialog",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin",
"dojo/text!./templates/FruitWidget.html"
], function(declare, ConfirmDialog, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, template) {

return declare([_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], {
    templateString: template,

    showWarning: function() {
        this.fruitWarningDialog.show();
    },

    checkForTimeout: function () {
        console.log('check for timeout called!');
        var self = this;
        var timeUntilWarning = 30 * 1000; // 30 seconds
        setTimeout(function() {
            self.showWarning();
        }, timeUntilWarning);
    },

    startMyFunction: function () {
        this.checkForTimeout();
    },

    printTimeout: function () {
        console.log('Timeout occurred!');
    }
 });
});

Я пытаюсь вызвать этот виджет из моего jsp, как показано ниже:

<script>
  require(["mywidgets/widget/FruitWidget"], function(FruitWidget) {
    var fruitWidget = new FruitWidget();
    fruitWidget.startMyFunction();
  });
</script>

Но когда истекает 30-секундный тайм-аут и вызывается showWarning, я получаю сообщение об ошибке:

There was an error on this page.

Error: Uncaught TypeError: Cannot read property 'show' of undefined
URL: mywidgets/widget/FruitWidget/FruitWidget.js

Я новичок в Додзё и не могу понять проблему. Почему fruitWarningDialog не определено, когда оно упоминается как data-dojo-attach-point в шаблоне?

1 Ответ

0 голосов
/ 22 января 2019

data-dojo-attach-point относится к узлу DOM, а не к самому виджету. Вы прикрепляете виджет к этому узлу, обычно в postCreate(). В вашем случае вы можете вызвать функцию show () напрямую:

showWarning: function() {
    this.show();
},
...