我在用dojo / registry检索按钮小部件时遇到问题。

我有一个小部件,在它的postCreate -function内部,还调用了其他一些功能。在最后一个registry.byId()中返回“undefined”,从而导致错误。具有提供ID的元素确实存在于html模板中。

我还在JSFiddle中创建了一个非常简单的工作版本,即使我在代码中尝试使用此变体,也会出现“未定义”的情况。 编辑:更新了小提琴

这是该代码的简短摘要,其中包含_setupButton-function中registry.byId()的原始用法以及declare -part之前的JSFiddle解决方案。这两个版本均返回“未定义”:

define(["dojo/_base/declare", "dojo/_base/array", "dojo/_base/lang", "dojo/dom-class", "dojo/number", "dojo/parser", "dojo/ready", "dojo/dom-construct", "dijit/registry", "dijit/form/NumberTextBox", "dijit/_Widget", "dijit/_TemplatedMixin", "dijit/Menu", "dijit/MenuItem", "dojo/text!./templates/template.html"],
function(declare, array, lang, domClass, number, parser, ready, domconstruct, registry, NumberTextBox, _Widget, _TemplatedMixin, Menu, MenuItem, templateStringContent) {

parser.parse();
ready(function () {
     console.info(registry.byId("startCalculationButton"));
});

return declare([_Widget, _TemplatedMixin],
{
    templateString: templateStringContent,

    postCreate() {
       this._setupButton();
    },
    _setupButton: function() {
       buttonWidget = registry.byId("startCalculationButton");
       buttonWidget.set("disabled", true);
    },
});

});

html与提供的JSFiddle-Snippet中的相同。其他ID(用于toher元素)也将不起作用。
那么,为什么registry.byId()可能对我不起作用?我是AMD风格的新手,并且该代码已经可以使用dijit.byId与旧语法一起使用。

编辑:

我发现该小部件未在注册表对象中注册。这可能是什么原因?如果找不到该模板,则会收到错误404,因此可以排除此原因。

编辑2:
document.getElementById()也会返回null。我认为传递templateString就足够了,而dojo还能做其他所有事情吗?

最佳答案

根据dojo documentation,小部件除了_TemplatedMixin之外还需要_WidgetsInTemplateMixin并从中继承:



由于dijit-button将是模板中的小部件,因此添加_WidgetsInTemplateMixin并从中继承可以解决我的问题,而无需进行其他更改。我的代码现在看起来像这样(缩短):

define(["dojo/_base/declare", "dijit/registry", "dijit/_Widget", "dijit/_TemplatedMixin", "dijit/_WidgetsInTemplateMixin", "dojo/text!./templates/template.html"],
function(declare, registry, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin, templateStringContent) {

return declare([_Widget, _TemplatedMixin, _WidgetsInTemplateMixin],
{
    templateString: templateStringContent,

    postCreate() {
       this._setupButton();
    },
    _setupButton: function() {
       buttonWidget = registry.byId("startCalculationButton");
       buttonWidget.set("disabled", true);
    },
});

关于javascript - dojo:使用registry.byID返回 “undefined”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30711297/

10-09 19:38