Polymer 1.0 动态添加菜单选项

Polymer 1.0 dynamically add options to menu

您好,我在获取动态添加选项的菜单时遇到了一些问题。他们的想法是第一个菜单的选择决定了第二个菜单包含的内容。我之前在没有聚合物的情况下成功地建造了这个。它与聚合物半工作。下拉菜单一根据选择从 json 获取其内容,下拉菜单二也从 json 获取其内容。这部分有效,问题是当您从下拉菜单一中进行选择然后更改它时,下拉菜单二不会删除旧的选择。我上次使用一个函数实现了这个功能,该功能在重新填充内容之前首先删除了所有下拉列表的两个子项。 Polymer 的问题是,一旦子节点被删除,下拉列表就会中断,并且无法通过数据绑定添加其他子节点。尝试使用纯 JS 添加本机以填充菜单,但子项不可选择(根据我的阅读,这可能是一个错误)。此外,我相信动态项目上的数据绑定也不再有效。不管怎样,这就是我所拥有的:

<link rel="import" href="../../../bower_components/polymer/polymer.html">
<link rel="import" href="../../../bower_components/paper-material/paper-material.html">
<link rel="import" href="../../../bower_components/paper-dropdown-menu/paper-dropdown-menu.html">
<link rel="import" href="../../../bower_components/paper-menu/paper-menu.html">
<link rel="import" href="../../../bower_components/paper-item/paper-item.html">
<link rel="import" href="../../../bower_components/iron-ajax/iron-ajax.html">
<link rel="import" href="../../../bower_components/paper-button/paper-button.html">
<link rel="import" href="../../../bower_components/iron-dropdown/demo/x-select.html">

<dom-module id="add-skill">
  <template>
    <paper-material elevation="1">
      <paper-dropdown-menu id="ddMenu" attr-for-selected="value" >
        <paper-menu class="dropdown-content" id="vendorSelect" on-iron-select="_itemSelected">
          <template is="dom-repeat" items="{{vendorList}}">
            <paper-item id="vendorName" value="item">[[item]]</paper-item>
          </template>
        </paper-menu>
      </paper-dropdown-menu>

      <paper-dropdown-menu>
        <paper-menu class="dropdown-content" id="certificationSelect" on-iron-select="_itemSelected">
        </paper-menu>
      </paper-dropdown-menu>

      <!-- testing ideas -->
      <paper-dropdown-menu>
        <paper-menu class="dropdown-content" id="test" on-iron-select="_itemSelected">
          <option extends="paper-item"> Option </option>
          <option extends="paper-item"> Option1 </option>
          <option extends="paper-item"> Option2 </option>
        </paper-menu>
      </paper-dropdown-menu>

      <paper-button on-click="_deleteElement">
        Delete
      </paper-button>
    </paper-material>
    <iron-ajax
      id="vendorSubmit"
      method="POST"
      url="../../../addskill.php"
      handle-as="json"
      on-response="handleVendorResponse"
      debounce-duration="300">
    </iron-ajax>

    <iron-ajax
      id="certificationSubmit"
      method="POST"
      url="../../../addskill.php"
      handle-as="json"
      on-response="handleCertificationResponse"
      debounce-duration="300">
    </iron-ajax>
  </template>
  <script>
    Polymer({
      is: 'add-skill',
      ready: function() {
        this.sendVendorRequest();
        this.vendorList = [];
        this.certificationList = [];
      },

      sendVendorRequest: function() {
        var datalist = 'vendor=' + encodeURIComponent('1');
        //console.log('datalist: '+datalist);
        this.$.vendorSubmit.body = datalist;
        this.$.vendorSubmit.generateRequest();
      },

      handleVendorResponse: function(request) {
        var response = request.detail.response;

        for (var i = 0; i < response.length; i++) {
          this.push('vendorList', response[i].name);
        }
      },

      vendorClick: function() {
        var item = this.$;
        //var itemx = this.$.vendorSelect.selectedItem.innerHTML;
        //console.log(item);
        //console.log(itemx);
      },

      sendCertificationRequest: function(vendor) {
        var datalist = 'vendorName=' + encodeURIComponent(vendor);
        console.log('datalist: ' + datalist);
        this.$.certificationSubmit.body = datalist;
        this.$.certificationSubmit.generateRequest();
      },

      handleCertificationResponse: function(request) {
        var response = request.detail.response;

        //var vendorSelect = document.getElementById('vendorSelect');
        for (var i = 0; i < response.length; i++) {

          this.push('certificationList', response[i].name);
        }

        console.log(this.certificationList);
      },

      _itemSelected: function(e) {
        var selectedItem = e.target.selectedItem;
        if (selectedItem) {
          this.sendCertificationRequest(selectedItem.innerText);
          console.log("selected: " + selectedItem.innerText);
        }
      },

      _removeArray: function(arr) {
        this.$.certificationList.remove();
        for (var i = 0; i < arr.length; i++) {
          console.log(arr[i]);
          arr.splice(0, i);
          arr.pop();
        }

        console.log(arr.length);
      },

      _deleteElement: function() {
        var element = document.getElementById('certificationSelect');

        while (element.firstChild) {
          element.removeChild(element.firstChild);
        }
      },

      _createElement: function() {
        var doc = document.querySelector('#test');
        var option = document.createElement('option');
        option.extends = "paper-item";
        option.innerHTML = "Option";
        doc.appendChild(option);
      }
    });
  </script>
</dom-module>

任何指导总是感激

这是 your JSBin 的工作版本,它使用数据绑定和 <template is="dom-repeat"> 来动态创建新的、可选择的 <paper-item> 元素。

我不确定您 运行 在使用数据绑定来消除 <paper-item> 元素时遇到了哪些具体问题,但在 Polymer 1.0 中要记住的重要一点是,当您修改Array(或 Object)绑定到模板,您需要使用 new helper methods(如 this.push('arrayName', newItem))来确保绑定已更新。

<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <base href="http://element-party.xyz">
  <script src="bower_components/webcomponentsjs/webcomponents-lite.js"></script>
  <link rel="import" href="all-elements.html">
</head>

<body>
  <dom-module id="x-module">
    <template>
      <paper-material elevation="1">
        <paper-dropdown-menu>
          <paper-menu class="dropdown-content" on-iron-select="_itemSelected">
            <template is="dom-repeat" items="[[_menuItems]]">
              <paper-item>[[item]]</paper-item>
            </template>
          </paper-menu>
        </paper-dropdown-menu>
        <paper-button on-click="_createItem">Add</paper-button>
      </paper-material>
    </template>

    <script>
      Polymer({
        _createItem: function() {
          this.push('_menuItems', 'New Option ' + this._menuItems.length);
        },

        _itemSelected: function() {
          console.log('Selected!');
        },

        ready: function() {
          this._menuItems = ['First Initial Option', 'Second Initial Option'];
        }
      });
    </script>
  </dom-module>

  <x-module></x-module>
</body>

</html>