按类检索dijit元素

时间:2017-02-01 21:14:55

标签: javascript dojo dijit.form

我想按类检索dijit元素。基于这些docs,我尝试了以下代码。我在dijit /工具栏上有一些dijit / form / ToggleButtons用于某些地图功能,我正在尝试设置切换。问题是,我得到了:' Uncaught TypeError:dijit.registry.byClass不是函数'

require([
  "esri/geometry/Extent",
  "esri/toolbars/navigation",
  "dojo/on",
  "dijit/registry",
  "dijit/Toolbar",
  "dijit/form/Button",
  "dijit/form/ToggleButton"
  //"dojo/domReady!"
],
function (Extent, Navigation, on, registry, Toolbar, Button, ToggleButton) {


  var navToolbar;

  navToolbar = new Navigation(window.myMap);


  var zoomInButton = new ToggleButton({
    label: "Zoom Avant",
    showLabel: false,
    iconClass: "zoominIcon",
    checked: false,
    onClick: function () {
      //alert("test button clicked")
      navToolbar.activate(Navigation.ZOOM_IN);
      toggleButtonIcon(this);
    }
  }, "zoomin");
  zoomInButton.startup();

  var zoomOutButton = new ToggleButton({
    label: "Zoom Arrière",
    showLabel: false,
    iconClass: "zoomoutIcon",
    onClick: function () {
      //alert("test button clicked")
      navToolbar.activate(Navigation.ZOOM_OUT);
      toggleButtonIcon(this);
    }
  }, "zoomout");
  zoomOutButton.startup();


  //this toggles the button highlight in the toolbar to show which tool is currently active
  //note - doesn't do the FullExtent since it's a button not a togglebutton
  function toggleButtonIcon(tool) {
    //only the tools in the toolbar are dijit togglebuttons so can iterate thru them
    dijit.registry.byClass("dijit.form.ToggleButton").forEach(function(togbtn) {
      if (togbtn == tool) {
        togbtn.attr("checked", true);
      }
      else {
        togbtn.attr("checked", false);
      }
    });
  }
});

HTML:

<div class="toolContainer">
  <div class="navBarClass" id="navToolbar" data-dojo-type="dijit/Toolbar" data-dojo-props="region:'top'" style="background-color:#ffffff;">
    <button type="button" id="zoomin"></button>
    <button type="button" id="zoomout"></button>
  </div>

</div>

更新:我在this docs page注意到一些可能相关的其他信息。然而,我现在对我的选择(对道场新手)感到困惑。我希望使用dojo / query。我需要能够根据课程区分几个按钮和其他按钮。

  

请注意,为了向后兼容,dijit.registry全局   变量(与dijit /注册表模块相对)包括数组   迭代器方法(forEach,filter,byClass,map,every和some)。   但是,AMD代码不应期望这些功能可用   从require([“dijit / registry”])返回的对象。

2 个答案:

答案 0 :(得分:2)

您需要了解this的工作原理。这里有两种方法链接在一起。完整的电话是:

dijit.registry.forEach(function(w){
     w.containerNode.appendChild(dojo.create("div"));
}).byClass("dijit.Dialog").forEach(function(w){ /* only dijit.Dialog instances */ });

第一种方法,dijit.registry.forEach()返回dijit/WidgetSetDoc)的实例。 dijit/WidgetSet实例有一个方法byClass。此方法的作用是,它将初始WidgetSet缩减为新的WidgetSet实例,该实例仅包含在这种情况下declaredClassdijit.Dialog的小部件。

要按类检索dijit元素,您可以使用dojo/queryregistry/getEnclosingWidget的组合。首先使用类查询窗口小部件的所有DOM节点。

var domNodes= query('.myClass', this.domNode);

然后,遍历此列表以查找与每个domNode对应的窗口小部件。

domNodes.forEach(function(domNode){
    var widget= registry.getEnclosingWidget(domNode);
    //do your processing
});

答案 1 :(得分:0)

dijit.registry.byClass在API中不存在,如错误中所述:

Uncaught TypeError: dijit.registry.byClass is not a function

你也可以从dijit文档:

http://dojotoolkit.org/api/?qs=1.10/dijit/registry

要查找小部件,您可以使用dijit.registry的以下功能之一:

  • byId(id)通过它的id找到一个小部件(我建议你使用这个小部件)。

  • byNode(node)返回与给定DOMNode

  • 对应的窗口小部件
  • findWidgets(root,skipNode)在根返回的小部件下搜索子树。