【问题标题】:How to parse a Dojo custom widget如何解析 Dojo 自定义小部件
【发布时间】:2014-05-21 15:04:20
【问题描述】:

我在编写自己的小部件时遇到了一些麻烦。我创建了一个继承自 _WidgetBase、_TemplatedMixin 和 _WidgetsInTemplateMixin 的小部件(因为我也在尝试构建一个 UI,其中小部件将包含其他小部件)。我正在使用 dojo/text 从模板加载小部件的标记。这是一个sn-p:

define([
"dojo/_base/declare",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin",
"dijit/_WidgetsInTemplateMixin",
"dojo/text!./templates/LayerManagerWidget.html"
], function (declare, _WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin, template) {
    return declare("myApp.ui.platforms.desktop.widgets.LayerManagerWidget", [_WidgetBase, _TemplatedMixin, _WidgetsInTemplateMixin], {

        // summary:
        //     This widget provides the layer manager user interface component

        // templateString: string
        //     Inherited from _TemplatedMixin, used to specify an HTML file to provide the markup
        templateString: template

    });

});

它在某种程度上起作用,我认为问题在于解析。因为小部件并不是从一开始就都需要,所以我认为它们没有被解析。 dojo 小部件教程中的一些示例包括小部件中的 dojo/ready 和 dojo/parser 并对其进行解析,但我无法弄清楚如何执行此操作:这些相同的示例之前没有“返回”我不太明白的声明语句,然后你如何用 var myWidget = new MyWidget(); 之类的东西实例化小部件?

所以我想问题的主要部分是,在上面的例子中,我应该在哪里调用 parser.parse() (或者一般来说,我如何确保这个小部件被解析)?

谢谢!

【问题讨论】:

  • 您是否尝试在制作新小部件后将根小部件节点传递给parser.parse(...)
  • @Shoe 您好,感谢您的评论。不,我没有尝试过 - 你能详细说明会去哪里/什么时候吗?即在小部件中的某处,或在实例化它的类中,在这种情况下,在启动()之前/之后?再次感谢!
  • 在您的小部件中,您可能会覆盖 startup 方法并将小部件根节点传递给 parser.parse(node)。
  • @Shoe 再次感谢,虽然仍然有点困惑,但注意到了另一种症状。我为小部件加载的 html 非常简单,只是
    Tools
    。在 postCreate 我试图做 dom.byId("toolsTitle") 但它返回未定义。我刚刚在 startup() 中尝试过,无论是否调用 parser.parse,但仍然未定义。这是否有助于查明我做错了什么?
  • 尝试使用data-dojo-attach-point='toolsTitle' 并在您的小部件中使用this.toolsTitle

标签: dojo


【解决方案1】:

在小部件代码本身中,您不应放置 parser.parse() 之类的东西或类似的东西。为了确保一个小部件被解析,你必须将它导入你的主 JavaScript 文件(一个带有 require() 块的文件)并自动或手动解析它。

例如,如果小部件位于一个名为 MyWidget.js 的文件中,您可以在主 JavaScript 文件中放置类似的内容(例如 app.js ):

require([ "custom/MyWidget", "dojo/parser" ]);

如果您已将 Dojo 配置为自动解析,这将正常工作。如果您想手动解析,可以使用:

require([ "dojo/parser", "custom/MyWidget", "dojo/domReady!" ], function(parser) {
    parser.parse(); // Parses the entire DOM
});

如果您想以编程方式创建小部件的实例,则根本不需要解析,只需使用:

require([ "custom/MyWidget", "dojo/domReady!" ], function(MyWidget) {
    var myWidget = new MyWidget({ }, "myDomNodeId");
});

例如:http://plnkr.co/edit/K3Zln6Q00g6v2DQeWcIM?p=preview

【讨论】:

  • 谢谢。我应该提到我不是“需要”html 页面上的所有小部件,因为我的计划是仅在需要时加载某些小部件。因此,在其中一个模块中,我有一些逻辑来确定需要什么,然后有另一个 require 语句来要求它们,然后以编程方式创建各种小部件。所以我不需要解析以编程方式创建的小部件,所以我认为这是要走的路。对于在父小部件 html 模板中以声明方式声明的小部件和以编程方式创建的父小部件,孩子是否需要解析以及如何解析?谢谢!
  • 小部件被实例化的那一刻(并且您正在使用dijit/_WidgetsInTemplateMixin),它们也会被自动解析。但是,您必须将小部件依赖项添加到您在小部件中导入的模块列表中(因此将它们添加到define())。
  • 我还举了一个例子,它使用了一个自定义小部件,其中包含正在以编程方式加载的小部件:plnkr.co/edit/K3Zln6Q00g6v2DQeWcIM?p=preview
【解决方案2】:

你读了吗

http://dojotoolkit.org/reference-guide/1.9/quickstart/writingWidgets.html

->

ready(function(){
    // Call the parser manually so it runs after our widget is defined, and page has finished loading
    parser.parse();
});

由于您编写了自定义 dijit 小部件,因此您可以在此处了解其生命周期中的其他功能:

http://dojotoolkit.org/documentation/tutorials/1.8/understanding_widgetbase/

-> "postCreate", "startup"

【讨论】:

  • parser.parse() 单独将解析整个 dom。如果你已经解析了 dom,它就会中断。
  • 感谢您的回答,但是是的:阅读并阅读教程,但仍在苦苦挣扎!在我上面的例子中,你会把准备好的语句放在哪里?由于return,它不能在declare之后进行。
猜你喜欢
  • 2011-11-25
  • 1970-01-01
  • 2014-09-03
  • 2012-03-07
  • 2014-09-05
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 2013-07-22
相关资源
最近更新 更多