Difference between registry.byId and dom.byId in d

2020-08-14 10:29发布

问题:

What is the difference between registry.byId and dom.byId in dojo? What is the advantage of using registry.byId?

In the code below I'm using dijit/registry and dojo/dom for both my textbox (#myTextBox3) and my textbox node (#textNode3). Only two of them are providing results.

require(["dojo/parser", "dojo/dom", "dijit/registry", "dijit/form/TextBox", "dojo/domReady!"],
    function(parser, dom, registry) {

    parser.parse();

    // Locate the JS object.
    var dibiWidget = registry.byId("myTextBox3");
    var dobiWidget = dom.byId("myTextBox3");
    var dibiDOM = registry.byId("textNode3");
    var dobiDOM = dom.byId("textNode3");


    dom.byId("textNode3").innerHTML = "registry.byId for widget id returned: " + dibiWidget + "<br>" +
        "dom.byId for widget id returned: " + dobiWidget + "<br>" +
        "registry.byId for dom id returned: " + dibiDOM + "<br>" +
        "dom.byId for dom id returned: " + dobiDOM + "<br>";
});

回答1:

These modules have a different usage. So there is no advantage of using registry.byId() (or dom.byId()) because they differ in use case.

dijit/registry::byId()

The dijit/registry module main use is retrieving widget instances. Quoting the reference guide:

dijit/registry stores a collection of all the dijit widgets within a page. It is commonly used to retrieve a reference to a widget from a related piece of data

dojo/dom::byId()

The dojo/dom module on the other hand is just a module to access DOM nodes. Quoting the information of byId() on the reference guide:

This is a simple alias to document.getElementById, which not only is shorter to write, but fortunately works in all browsers. It turns a domNode reference to some Node byId, or the same node reference if passed a domNode.

What does it mean?

The registry.byId() function will return an instance of your widget. This contains setters/getters and other stuff from the widget. This module should only be used to retrieve widgets, you cannot get a DOM node with it.

The dom.byId() function on the other hand will return the matching DOM node. You can only use it to retrieve a DOM node. A widget obviously also contains DOM nodes, but you should never directly access the DOM nodes of a widget because they're part of the internal structure of the widget (and may change).

When accessing a widget, always use registry.byId(). It provides APIs to access most DOM properties anyways.


Your code

So, your code demonstrates the 4 possibilities here. Assuming #myTextBox3 is a widget (for example of type dijit/form/TextBox) and #textNode3 is a DOM node, the following will happen:

  • dibiWidget will work because #myTextBox3 is a widget. It will return a reference to that widget
  • dobiWidget will probably work, because there is a DOM node behind every widget with the same ID (not required though). However, like I just explained, it's not recommended to use it.
  • dibiDom will not work because there is no widget with ID #textNode3. This is just a simple DOM node.
  • dobiDom will return a reference to the DOM node and will work.

I also made a small JSFiddle to demonstrate this.



回答2:

dom.byId() is just short for document.getElementById(...). It returns a reference to the dom node.

registry.byId(...) returns a reference to a dojo widget that is contained in dojo's registry.

For example if you have <div id='myDiv'></div>, You can't call registry.byId('myDiv') here because it isn't a dojo widget (thus isn't in the dojo registry). You can call dom.byId('myDiv').

Now if you had <div id='myDiv' data-dojo-type='dijit/layout/ContentPane'></div>, You can call both dom.byId('myDiv') and registry.byId('myDiv'). One gets you the dom node and the other gets you the dojo widget. Both will have different methods available to them but I generally favor registry.byId(...) if there is an overlap.

There isn't an advantage to using one or the other because they are both different things and used for different things.

https://dojotoolkit.org/reference-guide/1.9/dijit/registry.html

http://dojotoolkit.org/reference-guide/1.9/dojo/dom.html



标签: dojo