【问题标题】:How to dynamically populate iron-list elements如何动态填充铁列表元素
【发布时间】:2016-04-15 22:37:17
【问题描述】:

所以我有一个用于用户数据历史记录的 iron-list 元素。 铁列表不是自定义元素的一部分。它只是在页面上。我想在用户成功登录后填充。也许这只是我对聚合物的缺乏经验,但似乎没有一种直接的方法可以做到这一点。第一次尝试(为阅读而简化,例如我实际上并没有使用 jquery,我省略了很多错误处理代码等):

<iron-list as="item" style='height: 100%;' id='history-list'>
  <template>
    <div style='min-height: 140px;'>
      <ul>
        <!-- various fields for each record as list items -->
      </ul>
    </div>
  </template>
</iron-list>
<script>
  //once user is logged in
  var items = $.getJSON('userhistoryscript');
  //setAttribute doesn't work either
  document.getElementById('history-list').items = items;
</script>

我发誓这适用于早期版本的 Polymer。但它现在似乎不起作用,这很好,但我需要一个替代方案。

我考虑过的一些替代方案:

  1. 在同一 DOM 范围内拥有 iron-ajax 元素并设置 ' 用户登录后触发的 URL xhr 请求。我不确定这是否可行。

  2. 将列表包装在自定义元素中并使用 根据 chrisW 的回答进行铁元查询。

那些选项是可怕的。我不敢相信没有更简单的方法来完成这一壮举。我如何有条件地根据用户输入获取数据并动态向页面添加一个铁列表(或更新一个已经存在的列表)?这个用例真的没有 API 吗?

更新

感谢您的回答。原来我的原始代码实际上工作正常:它实际上是一个构建过程问题。由于某种原因,当我通过 bower 安装项目依赖项时,没有安装 iron-list。我取出硫化导入(肯定也不包含对 iron-list 的引用)并直接导入所有元素,然后我得到 404 并弄清楚发生了什么。

【问题讨论】:

    标签: javascript polymer-1.0 web-component


    【解决方案1】:

    我认为,为了获得最佳实践,您应该使用this.$.historyList 来引用此元素的 id。无论如何,当您获取数据以填充iron-list时,您应该使用this.set('items', data); 使用您的元素的示例如下所示:

    <iron-list>
        <template is="dom-repeat" items="{{data}}" as="history">
            <!--history.property-->
        </template>
     </iron-list>
    
    <script>
      Polymer({
        properties:{
            data:{type:Array, value:[],}
        },
        _functionToSetDataWhenUserIsLoggedIn: function(data){
            this.set('data',data);
        }
      });
    </script>
    

    编辑

    一个铁列表的例子

    <template is="dom-bind">
      <iron-ajax url="data.json" last-response="{{data}}" auto></iron-ajax>
      <iron-list items="[[data]]" as="item">
        <template>
          <div>
            Name: <span>[[item.name]]</span>
          </div>
        </template>
      </iron-list>
    </template>
    

    此示例使用自动执行的 ajax 调用并填充 iron-list,而无需创建自定义元素。

    更多关于iron-list的信息请点击:
    https://elements.polymer-project.org/elements/iron-list

    【讨论】:

    • 明确地说,我不一定打算将 Iron-list 包装在自定义元素中。您的回答似乎是在暗示完成我的目的的唯一方法就是这样做?我上面的那个脚本标签只是一个单独的 js 文件中的脚本。是动态设置内容以使脚本在同一个本地 DOM 中获取它的唯一方法吗?
    • 你为什么要重复铁名单。那不应该在模板之外吗?然后将
        放入模板中
    • 我对这个问题的理解不同@ChrisW,我已经编辑了我的答案。
    • 该编辑直接来自元素目录页面,而不是我的用例。我想动态地获取该json数据一次并且只获取一次用户登录(否则我怎么知道要获取哪个用户的历史记录?)。我的问题是如何?是的,我可以将整个东西包装在一个自定义元素中并公开一个 API 来做到这一点,但这不能更简单地完成吗?我提出的那个“解决方案”似乎结合了不应该的事情。
    【解决方案2】:

    我没有完全理解你的问题。希望这可以帮助。

      <iron-list items="[[data]]" as="item">
        <template>
          <div>
            Name: <span>[[item.name]]</span>
          </div>
        </template>
      </iron-list>   
    
        properties:{
            data:{type:Array, value:[],}
        },
        // the attached function is automatically called 
        attached: function() {
           // Use an iron meta in the element that you keep track in of login information
           // or create an onLogin listener
           var isLoggedIn = new Polymer.IronMetaQuery({key: 'isLoggedIn'}).value, 
           if (isLoggedIn) {
              var jsonData = $.getJSON('userhistoryscript'); 
              this.set('data',jsonData);
           }
        }
    

    旁注,当通过 Polymer 元素中的 id 访问元素时,请确保这样做:

    this.$.elementId
    

    Polymer.dom('#elementId')
    

    编辑,因为您不想创建自定义聚合物元素

    Source Code

      <template is="dom-bind">
        <iron-list id="list">
    
        </iron-list>  
    
      </template>
    
      <script>
        document.addEventListener('onLogin', function(event) {
          var list = document.getElementById('#list');
          var jsonDataObjects = $.getJSON('userhistoryscript'); 
          for (var i = 0; i < jsonDataObjects.length; i++) {
            var div = document.createElement('div');
            div.textContent = jsonDataObjects[i].info; // change this line
            list.appendChild(div);
          }
    
        });
      </script>
    

    【讨论】:

    • iron-meta-query 似乎正是我所需要的。我会测试一下。
    • @JaredSmith 希望这会有所帮助。另一个答案中的铁 ajax 元素是获取 json 的更具聚合性的方式
    • 想通了。更新的问题。感谢您的帮助,+1
    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    相关资源
    最近更新 更多