Javascript 当数据单向发送时,聚合物会绑定

Javascript 当数据单向发送时,聚合物会绑定,javascript,html,data-binding,polymer,polymer-1.0,Javascript,Html,Data Binding,Polymer,Polymer 1.0,我目前正在一个项目中使用Polymer,出于某种原因,当我不期望也不想要它时,我得到了数据绑定 我目前拥有的是一个样板聚合物项目,应该有我创建的新元素(名为shokka eval chart)。这很有效,但不知何故,这三个元素之间正在共享信息 为了调试这个问题,我在console.log中添加了一些消息,告诉我发生了什么。每次控制台日志返回时,都表明userData已被修改。这种修改发生在哪里?为什么 您可能会注意到一些事情: 使用单向数据绑定发送用户数据::[[userInfo.evaluat

我目前正在一个项目中使用Polymer,出于某种原因,当我不期望也不想要它时,我得到了数据绑定

我目前拥有的是一个样板聚合物项目,应该有我创建的新元素(名为shokka eval chart)。这很有效,但不知何故,这三个元素之间正在共享信息

为了调试这个问题,我在console.log中添加了一些消息,告诉我发生了什么。每次控制台日志返回时,都表明userData已被修改。这种修改发生在哪里?为什么

您可能会注意到一些事情:

  • 使用单向数据绑定发送用户数据::[[userInfo.evaluations]]
  • 不应将我对用户数据所做的更改通知索引:::通知:false
  • 我能想到的一些地方可能有问题:

  • HTML-我可能没有正确地将内容传递到标记中
  • Javascript-我不知道如何修改,但我可能正在修改那里的用户数据
  • 聚合物-明显的位置看。我可能误解了其中一个概念
  • 请让我知道这是在哪里发生的,我做错了什么让这发生。提前谢谢

    控制台日志

    shokka-eval-chart.html:89 Jan 16
    shokka-eval-chart.html:91 40
    shokka-eval-chart.html:92 40
    shokka-eval-chart.html:93 0
    shokka-eval-chart.html:89 Jan 16
    shokka-eval-chart.html:91 0
    shokka-eval-chart.html:92 40
    shokka-eval-chart.html:93 -40
    shokka-eval-chart.html:89 Jan 16
    shokka-eval-chart.html:91 -40
    shokka-eval-chart.html:92 40
    shokka-eval-chart.html:93 -80
    
    索引


    为了解决这个问题。这解决了我遇到的问题,但仍然让我想知道为什么要从不同的标签修改userData。如果有人能发表评论并让我知道原因,我将不胜感激。

    我怀疑您期待这一行

    var data = userData;
    
    要创建
    userData
    的副本,但在此行之后,
    data
    userData
    指向相同的数据结构

    试试看

    var data = userData.splice();
    

    只是猜测而已。如果这不是问题所在,我不知道是什么原因导致了问题。

    这可能就是问题所在,但我记不起我自己尝试时它是否有效。我在下面用斜体字强调

    配置默认属性值

    可以在properties对象中使用value字段指定特性的默认值。该值可以是基元值,也可以是返回值的函数

    如果提供函数,则Polymer会对每个元素实例调用该函数一次

    将属性初始化为对象或数组值时,请使用函数确保每个元素都有自己的值副本,而不是在元素的所有实例中共享对象或数组


    来源:

    这将有助于我立即不更改用户数据。但是,我不明白为什么更改userData甚至会更改其他标记中的userData。当下一个标签更改userData时,为什么它已经更改了?实际上我不确定我是否理解您的问题,我只是怀疑这就是问题所在。当多个地方引用同一个数组实例,其中一个地方进行了更改,而其他地方引用了同一个数组实例时,请参见修改。如果只想一次更改数组,则不同的引用需要指向它们自己的数组副本
    .splice()
    创建这样的副本。您似乎希望传递数组的副本,而不是对原始数组的引用。事实并非如此。在尝试您的建议后,我发现数据返回时是一个空数组
    []
    。我做了一些挖掘,发现我也可以用同样的方式使用
    .slice()
    。我试过了,它仍然给了我和我不使用它时一样的输出。这里有什么
    .splice()
    可以做而
    .slice()
    不适合我的事情吗?投票结果:我在看,你的意思是
    .slice()
    。我很欣赏这个想法,因为这是我的一个重大疏忽。我想问题还是一样的,只是更深一层而已。在
    var data=userData.slice()之后
    data
    userData
    是不同的数组,但它们的元素也是数组,
    slice()
    不做深度复制,只做浅层复制。这意味着
    userData
    data
    的元素只是对相同数组的引用。您需要递归地运行
    slice()
    。太好了,您已经解决了!我正要创建一个plunker,但我在JS:-/方面的速度非常慢,而接受的答案之所以有效,是因为您使用
    slice
    创建了一个新的数组,并因此切断了对原始数组的引用。
        var data = [];
        for (var i = 0, len = userData.length; i < len; i++) {
          data[i] = userData[i].slice();
        }
    
    var data = userData;
    
    var data = userData.splice();
    
      data: {
        type: Object,
        value: function() { return {}; }
      }