Dojo 小部件声明字符串 - 它是临时的吗?

Posted

技术标签:

【中文标题】Dojo 小部件声明字符串 - 它是临时的吗?【英文标题】:Dojo widget declaration string - is it a temporary thing? 【发布时间】:2013-02-19 18:13:14 【问题描述】:

我想知道这是否是临时的事情('my.example.Widget'),现在 AMD 已经出现了,还是会出现?

declare('my.example.Widget', [], 

);

如果我有一个如上所述定义的小部件,我如何检查小部件的类型?有没有一种适用于 AMD 的方法?

【问题讨论】:

对不起,但我不明白这个问题。能不能换个说法? 你不应该再需要它了,尽管它是向后兼容的好习惯。你是说如果你声明你的小部件像declare([], ) 你的代码不能识别你的小部件类型?您是否尝试过至少让您的小部件扩展 dijit/_WidgetBase?此外,如果您要包含字符串,v1.7+ 中的较新样式是“my/example/Widget”。如果您不这样做并尝试以声明方式使用data-dojo-type="my.example.Widget",您将收到错误消息。现在我想了想,你是如何尝试使用这个小部件来得到 unreconized TypeError 的? 由于我使用的是 Dojo 的 .isInstanceOf() 函数,我无法想象这将如何使用 / 而不是 .,传入类型而不是字符串? 您说“您至少可以尝试...” 现在我想知道 - 在 Dojo/AMD 中检查小部件类型的最终方法是什么?请记住,我不想知道一切,即使它是一个 mixin 的实例,而不仅仅是主要类型。 用 widget.isInstanceOf('my/example/Widget') 试过了,但失败了。 【参考方案1】:

检查您的 Dijit 小部件是否继承自特定 Widget 或 Mixin 的方法是使用 isInstanceOf 函数,如下所示:

var Widget = declare([_WidgetBase], 
     name: "Widget_Name",
     id: "some_id"
);
var widgetInstance = new Widget();
console.log(widgetInstance.isInstanceOf(Widget)); // True
console.log(widgetInstance.isInstanceOf(_WidgetBase)); // True
console.log(widgetInstance.isInstanceOf(_TemplatedMixin)); // False

您可以通过 this jsfiddle 看到它的实际效果。

【讨论】:

所以你必须在你检查的类型作为依赖项导入的上下文中检查它? 不幸的是,是的。我可以想到一个自定义函数,您可以使用它来传递一个字符串,但它需要对“隐藏”小部件属性进行一些“肮脏”的内省。脏,我的意思是根据 dojo,这是一种糟糕的做法,因为您必须访问小部件类的元信息。 Dojo 对这样的事情有这样的说法: 所有的元信息都可能发生变化,不应在正常编码过程中使用。如果您使用它,请准备好在代码更改时更新代码。 如果你没问题(事实上,由于 Dojo 库“后端”的变化,它会在没有太多警告的情况下中断),然后问另一个 *** 问题,关于这样的事情是如何发生的完成(检查小部件是否是基于字符串的特定类型),我很乐意为您提供一些选项。

以上是关于Dojo 小部件声明字符串 - 它是临时的吗?的主要内容,如果未能解决你的问题,请参考以下文章

小部件上的 dojo 查询

dojo中以编程方式与以声明方式创建的小部件之间的区别?

以编程方式(但不是以声明方式)实例化小部件时出现 Dojo 重复 ID 错误

如何编写我的小部件而不在 dojo.ready 中声明它的代码

如何将 Dijit 小部件动态添加到 Dojo 表单?

Dojo Dijit - 小部件中的小部件