dojo:使用registry.byID返回" undefined"

时间:2015-06-08 14:04:48

标签: javascript dojo amd

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

我有一个小部件,在其中postCreate - 函数调用其他一些函数。在最后一个registry.byId()返回" undefined"导致错误。具有提供的id的元素确实存在于html模板中。

我还在JSFiddle中创建了一个非常简单的工作版本,即使我在我的代码中尝试这个变体,我也得到了#34; undefined"。 编辑:更新了小提琴

以下是在_setupButton函数中原始使用registry.byId()的代码的简短摘要,以及declare部分之前JSFiddle的解决方案。两个版本都返回" undefined":

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,因此我们可以排除。

EDIT2:

同样document.getElementById()将返回null。我以为传递templateString就足够了,dojo会做其他所有事情吗?

2 个答案:

答案 0 :(得分:1)

根据dojo documentation_TemplatedMixin _WidgetsInTemplateMixin以外的小部件需求并继承它:

  

但是,如果我们想要在模板中包含一个小部件,例如:

<div class="combinedDateTime">
   <div data-dojo-type="dijit/form/DateTextBox"></div>
   <div data-dojo-type="dijit/form/TimeTextBox"></div>
</div>
     

在直接扩展的窗口小部件类中使用此模板时,您将会这样做   需要混合dijit._WidgetsInTemplateMixin   dijit._TemplatedMixin。

由于dijit按钮将是我模板中的一个小部件,因此添加_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);
    },
});

答案 1 :(得分:0)

我注意到您的代码中可能需要特别关注的内容:

require([
    "dojo/ready",
    "dijit/registry"
], function(
    ready,
    dijitRegistry
) {
    ready( function() {
        var grid = dijitRegistry.byId("startCalculationButton");
        console.info(grid)
        grid.set("disbaled", true);
    });
});

我认为它应该是: require([“dojo / ready”,“dijit / registry”],功能(准备好,注册表){...} 然后你可以使用注册表 .byId(“somename”)

如果您在require语法中使用dgrid / extensions / DijitRegistry , 那么你应该在你的需要语法之后加入 DijitRegistry (请注意,它区分大小写),但根据我的经验,我只将它用于dgrid mixin ......

希望这可以帮助...