【问题标题】:Error | Removing disallowed attribute on SelectElement错误 |删除 SelectElement 上的不允许属性
【发布时间】:2015-02-07 17:39:23
【问题描述】:

我正在尝试使用一个按钮在单击该按钮时在 html 表中添加一个新行,并使用另一个按钮在选中其复选框的情况下删除该行。我遇到了两个问题:

  1. 每当点击添加按钮时,我都会得到Removing disallowed attribute SELECT on-change="{{ onChangeTypeFired }}"
  2. 如果我选中两个复选框并单击删除行按钮,则会引发 indexIndexSizeError:索引或大小为负数,或大于允许的值。提供的索引 (2) 大于表中的行数 (2)。

文件如下所示

.html

        <!DOCTYPE html>

        <link rel='import' href='../../../../packages/polymer/polymer.html' >

        <link rel='import' href='../../../../packages/paper_elements/paper_checkbox.html' >
        <link rel='import' href='../../../../packages/paper_elements/paper_button.html' >
        <link rel='import' href='../../../../packages/core_elements/core_collapse.html' >
        <link rel='import' href='../../../../packages/core_elements/communication_icons.html' >

        <polymer-element name='phone-form'>
          <template>

            <div
              class='parent-container'>
              <paper-button id='add-btn' on-click='{{toggle}}'>
                <core-icon id='toggle-btn-icon' icon=''></core-icon>
                Phone
                <core-icon id='validation-icon' class='margin-l5px' icon=''></core-icon>
              </paper-button>



            <table id='table' border='1' width='350px'>
                <tbody><tr>
                    <td><input name='chk' type='checkbox'></td>
                    <td>
                      <select id='phoneType' class='width95percent'
                          selectedIndex='{{typeSelected}}' 
                          on-change='{{onChangeTypeFired}}'>
                          <option template repeat='{{key in types.keys}}' 
                          value='{{types[key]}}'>{{types[key]}}
                        </option>

                      </select>
                    </td>
                </tr>
            </tbody></table>
             </div>
             <div>
              <paper-button raised id='add-row-btn' class='margin-8px'

                on-click='{{addRow}}'>
                Add Row
                <core-icon id='add-row-btn-icon' icon='check-all'></core-icon>
              </paper-button>

              <paper-button raised id='delete-row-btn' class='margin-8px'

                on-click='{{deleteRow}}'>
                Delete Selected Row(s)
                <core-icon id='delete-row-btn-icon' icon='check'></core-icon>
              </paper-button>

             </div>



            </div>
          </template>
          <script type='application/dart' src='phone_form.dart'></script>
        </polymer-element>

.dart

import 'package:polymer/polymer.dart';
import 'dart:html' as dom;

import 'package:paper_elements/paper_button.dart' show PaperButton;
import 'package:core_elements/core_collapse.dart';

//import 'package:epimss_shared/epimss_shared.dart';
//import 'package:epimss_shared/epimss_shared_client.dart' hide DataEvent;

@CustomTag('phone-form')
class PhoneForm extends PolymerElement {

  @observable String errorMsg;
  String topic;
  PaperButton addBtn;

  int typeSelected = 0;
  CoreCollapse coreCollapse;

  @observable
  Map<String, String> types = <String, String> {
    '': '',
    'Car': 'Car',
    'Direct': 'Direct',
    'Fax': 'Fax',
    'Home': 'Home',
    'Mobile': 'Mobile',
    'Video': 'Video',
    'Work': 'Work'
  };

  PhoneForm.created() : super.created();


void toggleCoreCollapse() {
  coreCollapse.toggle();
}

  void onSelectTypeFired()
  {

  }

  void onChangeTypeFired( dom.Event e, var detail, dom.SelectElement target)
  {
    print(target.value);
  }

  void addRow()
  {
    var table = $['table'];
    var rowCount = table.rows.length;
    var row = table.insertRow(rowCount);
    var colCount = table.rows[0].cells.length;

    for(var i = 0; i<colCount; i++ )
    {
      var newcell = row.insertCell(i);
      newcell.innerHtml = table.rows[0].cells[i].innerHtml;

      switch(newcell.childNodes[0].runtimeType.toString())
      {
        case 'text':
          newcell.childNodes[0].value = '';
          break;

        case 'checkbox':
          newcell.childNodes[0].checked = false;
          break;

        case 'select':
          newcell.childNodes[0].selectedIndex = 0;
          break;
      }
    }
  }


  void deleteRow()
  {

    var rowsToDelete = [];

    try{
      var table = $['table'];
      var rowCount = table.rows.length;

      for(var i = 0; i < rowCount; i++)
      {
        var row = table.rows[i];
        var chkbox = row.cells[0].childNodes[0];

        if(chkbox != null && chkbox.checked)
        {
          if(rowCount <= 1)
          {
            print('Cannot delete all the rows.');
            break;
          }
          else
          {
            rowsToDelete.add(i);
          }
        }
      }

      rowsToDelete.forEach( (row)
          {
            table.deleteRow(row);
          });
    }
    catch(e)
    {  print(e); }
  }


  @override
  void attached() {
    super.attached();
    topic = this.dataset['topic'];

    coreCollapse = $['core-collapse'];

    addBtn = $['add-btn'];
  }



}

感谢您的帮助。

【问题讨论】:

    标签: dart dart-polymer


    【解决方案1】:

    可能是这条线造成的

    newcell.innerHtml = table.rows[0].cells[i].innerHtml;
    

    您需要指定允许将哪些元素和标签从字符串添加到 DOM。 有关详细信息,请参阅https://stackoverflow.com/a/27334820/217408

    这不适用于像new DivElement() 这样的命令式生成元素。

    在您的示例中,这样做可能会更容易更好

    newcell.children.clear();
    newcell.children.addAll(table.rows[0].cells[i].children.map((c) => 
        c.clone(true)));
    

    注意:我不确定代码应该是什么样子,但我想你明白了。如果您无法解决,请添加评论,我会仔细查看。

    【讨论】:

    • 你好,甘特。我花了一天的大部分时间在这上面,并且遇到了不同类型的问题。请仔细看看,谢谢。
    • 我在滑雪 :) 今天晚些时候我会去看看。
    • 我更新了代码。我现在很确定它是正确的。
    • 谢谢甘特。有用。为什么事件处理程序也不会被克隆?在原始行中,事件处理程序有效,但在克隆的行中却没有。
    • 我不知道为什么没有克隆事件处理程序。我只是试图帮助您克服报告的错误。我认为将 HTML 包装在 &lt;template repeat=...&gt; 或在本例中为 &lt;table repeat=...&gt;&lt;tr repeat=...&gt; 并让 Polymer 从集合中的数据生成 HTML 是一种更好的方法。这样,Polymer 将为您设置事件处理程序。
    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2020-09-25
    • 2019-12-30
    • 2013-09-22
    • 2018-01-25
    • 1970-01-01
    相关资源
    最近更新 更多