【问题标题】:Select all on dojo checkbox group在 dojo 复选框组上全选
【发布时间】:2011-06-16 03:42:14
【问题描述】:

我目前有一个 dojo 复选框组(dijit.form.CheckBox,名称格式为“some_name[]”)它完全按照需要工作,但是我需要添加一个全选按钮/链接,最好不要添加另一个复选框(这个鉴于功能将在 js 中实现,因此不需要)。

这是一种“dojo”方式,因为使用标准 js 似乎可以很好地处理元素,但设置 element.checked=true 没有效果。出于测试的目的,我禁用了 dijit.form.CheckBox(所以我有常规的沼泽标准复选框),并且我能够用 dojo'ified 时失败的代码标记所有选中的框。

如果这有什么不同的话,我正在运行 dojo 1.5

更新:

好的,似乎将复选框设置为选中/取消选中,但不重新渲染 dojo 小部件。我还被告知复选框没有任何我希望它们具有的方法作为 dijit.form.CheckBox 对象(如 set() 方法)。

【问题讨论】:

    标签: javascript html dojo


    【解决方案1】:

    所以我发现了问题所在。我正在做 dojo.query() 来获取复选框组 dom 节点。但是,这不会返回 dijit 小部件。为了得到那些我必须做的事情:

    nodes = dojo.query('[name=\"checkbox_group[]\"]'); 
    dojo.forEach(nodes,function(node)   
      {dijit.getEnclosingWidget(node).set("checked",true);});
    

    通过操作小部件,它可以正确地进行视觉更新。另外,我不知道复选框输入元素不是小部件本身,因此 dijit.byNode(node) 返回 undefined 因为复选框节点与任何已初始化的 dijit 小部件都不匹配。

    【讨论】:

      【解决方案2】:

      我们这样做如下所示。这是从许多其他东西中减少的,这些东西在页面加载时被调用的“addHandlers”函数中作为处理程序连接起来。

      selectall 和 clearall 是我们要连接的链接。

      var selectall = dojo.byId('selectall');
      var clearall  = dojo.byId('clearall');
      
      var checklist = getCheckboxList(); // Magic happens here (1)
      
      dojo.connect(selectall, "onclick",
          function(evt) {
              allClick(evt, checklist, true);
          }
      );
      
      dojo.connect(clearall, "onclick",
          function(evt) {
              allClick(evt, checklist, false);
          }
      );
      

      (1) 我们会根据一些丑陋的标准获得将受到影响的复选框列表,并且我们使用该列表的目的不仅仅是检查/清除所有 - 您可能会做一些更简单的事情来获得您的。

      “allClick”函数只是检查或取消选中您传递给它的事物列表

      function allClick(evt, list, checkstate)
      {
          dojo.forEach(list,
              function(el, idx, ary) {
                  el.checked = checkstate;
              }
          );
          evt.preventDefault(); // keep the link from firing
      }
      

      【讨论】:

      • 这就是我一直在做的事情。问题是 dojo 似乎覆盖了 e1.checked = true;
      • 我在下面找到了答案。抱歉,我在最初的问题中不能说得更清楚,我仍然在 dojo 中找到自己的方式,并且经常不知道我错过了哪一块拼图。
      【解决方案3】:

      如果有人正在寻找答案,而现在(4 年后)有另一种方法可以做到这一点:

      var checkboxes = registry.findWidgets(dom.byId('checkGroupWrapper'));
      
      checkboxes.forEach(function (checkboxWidg) {
          checkboxWidg.set('checked', true);
      });
      

      见this documentation。

      【讨论】:

        猜你喜欢
        • 2023-03-12
        • 2016-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-13
        • 2016-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多