dojo:使用 registry.byID 返回“未定义”

Posted

技术标签:

【中文标题】dojo:使用 registry.byID 返回“未定义”【英文标题】:dojo: using registry.byID returns "undefined" 【发布时间】:2015-06-08 14:04:47 【问题描述】:

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

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

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

这里是在 _setupButton 函数中最初使用 registry.byId() 的代码的简短摘要,以及来自 declare 部分之前的 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 会做其他所有事情吗?

【问题讨论】:

什么负责最初创建/放置startCalculationButton 我忘了粘贴一行代码。我用 dojo/text 拉模板!如dojo documentation 中所述,并将此字符串传递给templateString-Member。我还有更多工作要做吗? 【参考方案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>

在直接扩展的小部件类中使用此模板时,您将 需要mixin 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);
    ,
);

【讨论】:

很好的答案,解决了我的问题,我无法从小部件模板中检索字符串 id,现在我可以在添加之后【参考方案2】:

我注意到您的代码中可能需要特别关注一些问题:

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"], function(ready, registry) ... 然后你可以使用 registry.byId("somename")

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

希望这可以帮助...

【讨论】:

mh...现在我有点困惑。当我发布我的 Question der JSFiddle 工作时......现在它不起作用,我明白你为什么发布这个提示。但是像你推荐的那样改变小提琴并没有帮助,而且 JSFIddle 仍然对我不起作用......我现在真的很困惑...... 这是我编辑后的版本:jsfiddle.net/1x3dat6e/14 按钮不会显示,但至少它可以读取网格是什么(按钮) 谢谢!我用新链接更新了原始帖子。不幸的是,您的想法对我的实际问题没有帮助。见原帖。 还有...怎么样,jsfiddle.net/1x3dat6e/50 我注意到你没有包含 claro css,所以按钮不会显示...然后,我重新编码,使用你之前写的 dom/ready 你也可以看到这个链接:jsfiddle.net/1x3dat6e/52我的意思是,你必须先让dojo解析器解析你的HTML文档,这样它才能被dijit/registry识别...

以上是关于dojo:使用 registry.byID 返回“未定义”的主要内容,如果未能解决你的问题,请参考以下文章

推迟 Dojo Deferred

自定义小部件内的 dojo 小部件的可寻址性

为啥 on-change 事件在下拉列表中工作一次?

可以createNativeQuery的EnityManager返回resultClass即dojo类

dojo / mvc / at不以约束datePattern的格式返回dijit / form / DateTextBox

DOJO js 基本dom操作