【问题标题】:Dojo - How to set "label" of togglebutton inside a grid from row.data.SOMEFIELD value?Dojo - 如何从 row.data.SOMEFIELD 值设置网格内切换按钮的“标签”?
【发布时间】:2017-08-31 14:20:19
【问题描述】:

我是 Dojo 的新手。 我有一个“FullEditable”网格,有很多列,其中之一是一个小部件,它是一个 ToggleButton。此网格用于显示购买的详细信息,因此每条线代表已售出的产品。当我单击其中一列内的按钮时,它会启动产品(对话框)浏览器,然后将该产品的数据传递到网格。经过一些工作后,我设法显示按钮并能够根据从该对话框收到的 row.data.FIELD 值设置它的标签。

但现在我正在编辑该购买,我需要能够执行相同的操作,以便能够将带有数据(“detelle”)(因为它是标签)的预加载数组中的数据加载到切换按钮中,但什么也没有似乎工作,甚至没有直接分配小部件或行数据或任何东西。 这是我的代码片段:

  var grid = this;
  var selectedRow = grid.row(i);
  var cell = grid.cell(selectedRow, 'Moneda');
  selectedRow.Moneda = detalle.MonedaItem; //didn't work
  if(cell.row !== null && cell.row !== undefined && cell.row.data !== null && cell.row.data !== undefined)
    cell.row.data.Moneda = detalle.MonedaItem; //didn't work


    if(cell.element !== null && cell.element !== undefined){
      cell.element.innerText = detalle.MonedaItem; //didn't work
      cell.element.textContent = detalle.MonedaItem; //didn't work

      if(detalle.MonedaItem === 'UF')
        cell.element.widget.set('checked', true);
      if(detalle.MonedaItem === 'CLP')
        cell.element.widget.set('checked', false);

      cell.element.widget.set('label', detalle.MonedaItem); //didn't work
      cell.element.widget.set('value', detalle.MonedaItem); //didn't work
    }
  }

每当我使用“cell.element.widget.set('checked', boolean);”通过更改事件设置值时我从编辑器收到一条错误消息,当它试图获取一个单元格但变量为空时,它会崩溃。

小部件、row.data 单元格的“标签”和“值”值已完美设置,但网格显示小部件的“emptyValue”值,而不是实际设置的值。

【问题讨论】:

    标签: dojo togglebutton dgrid


    【解决方案1】:

    AFAIK,更改网格数据的最佳方法是更新与网格关联的存储/集合,然后调用 grid.refresh()。新数据将自动加载。

    cell.row.data.Moneda = detalle.MonedaItem 语句实际上是在更改存储中的数据。只需refresh 之后的网格,您就完成了!

    切勿尝试直接在网格 DOM 元素中设置某些内容。始终与商店合作,renderCellrenderColumn。这将确保引用 store 的 store 和 grid 属性的一致性。

    【讨论】:

    • 在我分享的代码之后是 grid.refresh(),它在视觉上什么都不做。正如我所说,数据、集合、单元格和小部件获得正确的值,但在 editor.js 文件上设置值后,返回“this”,但“this”的值有“错误”标签。所以我添加了另一个函数来通过 cell.row.data.Moneda 再次设置该值,但随后更改再次触发了 editor.js 上的函数,然后该值再次被覆盖。我知道我不应该尝试通过 dom 分配值的暴行,但即使这样也没有用。
    • 您是否尝试过直接在商店中更改值,然后在网格上调用refresh
    • 是的,即使商店和集合对象中的值是正确的
    【解决方案2】:

    我终于设法通过 renderCell 得到了我需要的东西:

    ,{
          id: 'Moneda', 
          field: 'Moneda',
          label: "Moneda",
            renderCell: function (object, value, node, options) {
              try {
                var button = new ToggleButton({
                  node: node,
                  isWidgetInGrid: true,
                  parameterName: 'codigoMoneda',
                  label: object.Moneda,
                  showLabel: true,
                  onChange: function(newValue){
                    var grid = this.getParent();
                    var row = grid.row(this.node);
                    var data = row.data;
                    if(this.get('label') === 'CLP')
                    {
                      data.Moneda = 'UF';
                      this.set('label','UF');
                      this.set('value', 'UF');
                    }
                    else
                    {
                      data.Moneda = 'CLP';
                      this.set('label','CLP');
                      this.set('value', 'CLP');
                    }
                    grid.getParent().getParent()._calcularTotales();
                  }
                });
    
                node.appendChild(button.domNode);
              }
              catch (ex) {
                Debug.log(this.declaredClass, arguments, ex);
              }
            },
          emptyValue: 'CLP',
          autoSave: true
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多