【问题标题】:Polymer 2.0 Data-Binding ArrayPolymer 2.0 数据绑定数组
【发布时间】:2018-03-21 22:49:23
【问题描述】:

我正在尝试显示我存储在 Firebase 数据库中的所有候选人的列表。我正在使用 Polymer 2.0 Starter-Kit。

代码如下:

_checkParties() {
      var candidate_list = []
      firebase.database().ref("/candidates/"+this.party.$key).once("value", function(snapshot) {
          snapshot.forEach(function(snap) {
              var data = {"key": snap.key, "data": snap.val()}

              var results = Object.keys(data["data"]).map(function(key) {
                return {
                    name: key,
                    value: data["data"][key],
                    key: data["key"]
                };
              })
              candidate_list.push(results[0])
          })
      })
      this.candidates = candidate_list;
  }

基本上,我从我的 firebase 查询该路径的子节点,然后将它们附加到我的 var candidate_list。在查询之外,我将this.candidates 设置为数组var candidate_list

这是我的模板的代码:

<template is="dom-repeat" items="{{ candidates }}" as="candidate">
      <div class="card">
          <p>[[candidates]]</p>
          <h3>[[candidate.name]] - [[candidate.value]]</h3>
          <paper-button raised style="color: yellow; background-color: black;" on-tap="_castVote">Vote</paper-button>
      </div>
  </template>

我的静态属性的代码:

candidates: {
            type: Array,
            value: []
          }

然后是我的构造函数:

constructor() {
    super();
  }

我尝试将其添加到我的构造函数中,但似乎没有任何影响:

constructor() {
    super();
    this.candidates = [];
  }

结果应该是我的模板 dom-repeat 中的卡片显示了所有候选人。相反,我什么也没得到。 但是当我console.log 时,我可以看到我所有的候选人。

【问题讨论】:

    标签: javascript firebase polymer


    【解决方案1】:

    我不确定您的 _checkParties 被调用到哪里,但听起来 Polymer 不知道您更新了候选人 array

    我认为第一次尝试可能是使用 set 方法,以确保收到更新通知,如 here 所述。所以这意味着替换方法中的最后一条语句。而不是

    this.candidates = candidate_list;
    

    你会的

    this.set('candidates', candidate_list);
    

    另一个似乎非常适合您正在做的事情的选项是将候选人列表作为计算属性。因此,您只需将 'computed' 键添加到您的属性定义中:

    candidates: {
        type: Array,
        value: [],
        computed: '_checkParties(candidatesResponse)',
    }
    

    在你的方法中你必须返回列表,而不是覆盖属性,所以

    return candidate_list;
    

    而不是上面提到的同一行。

    【讨论】:

    • 感谢您的回答!我确实尝试过this.set(),但后来this 没有被识别。我可以通过在循环外执行var self = this 来解决问题。我还没有尝试过计算。哪个性能更好? computedthis.set?
    • @Mikebarson 所以你说你是通过使用 set 方法让它工作的?顺便说一句,如果您可以使用 ES6,您可以使用箭头函数语法来避免绑定 this 关键字,因此您不需要将您的范围“缓存”在另一个变量中;当谈到使用 set 方法设置列表与观察者相比的性能差异时,我不知道是否有任何差异,使用计算属性只是有点意义,因为这就是这里实际发生的情况。但我想你可以使用最适合你的方法。
    • 是的,我使用了 set 方法。所以在性能上没有区别,好吧。你能澄清一下 ES6 的语法是什么吗?我对整个 ES6 系统很陌生。是这样的吗? function() =&gt;?
    • ES6 是对 JavaScript 语言的一组更新,它提供了许多新特性和语法糖。其中之一是箭头函数,您可以在此处看到它的描述:mzl.la/1rrAsL3 其中有一段“无此绑定”,它解释了为什么这是一个替代方案。但是你应该决定是否要使用 ES6 语法,因为它还没有被所有浏览器支持。通常人们只有在决定只支持现代浏览器或保存运行转译器的构建过程时才使用它。
    • 谢谢!接受这个答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多