【问题标题】:AngularJS: 'Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys."AngularJS:'不允许在转发器中重复。使用 'track by' 表达式来指定唯一键。”
【发布时间】:2014-10-02 20:11:18
【问题描述】:

我在 codepen 上有这个代码示例:http://codepen.io/anon/pen/hauvb

问题是 ng-repeat 在我将表单对象推送到数组后没有更新。我可以看到内容正在添加到数组中,但 ng-repeat 没有更新。我尝试使用 $apply 但我被告知我不需要它,因为 ng-click 为我更新了 $digest。任何帮助将不胜感激,以了解我所缺少的。谢谢。

var app = angular.module('theTasker', []);


app.controller('MyTasks', [function(){
  this.tasks = [
    {
      title: "This is the title",
      completed: false
    },
    {
      title: "This is the title",
      completed: true
    },
    {
      title: "This is the title",
      completed: false
    }
  ];

  this.myform = {
    item: "Item Title",
    completed: false
  };
  this.addtask = function(){
    this.tasks.push(this.myform);
  };
}])

编辑:

上面的代码产生了这个错误:

不允许在转发器中重复。使用“track by”表达式 指定唯一键。

【问题讨论】:

    标签: angularjs ng-repeat


    【解决方案1】:

    在测试您的代码时出现错误

    不允许在转发器中重复。使用“track by”表达式指定唯一键。

    将您的 HTML ng-repeat 行更改为如下所示:

    li(ng-repeat="task in mytasks.tasks track by $index")
    

    这是一个例子plnkr

    您在 myform 对象中也有错字,您在其中指定了“项目”而不是“标题”,因此添加了新任务,但标题未显示。

    将其更改为如下所示:

    this.myform = {
      title: "Item Title",
      completed: false
    };
    

    这是一个固定的code-pen

    【讨论】:

    • 谢谢 - 这就是问题所在。我希望你不介意我扩展这个问题,现在它正在工作,我注意到当我添加两三个不同的项目时,它们现在都更新为最新条目的值。本质上我只是复制对象而不是创建对象的新实例。我不确定在这种情况下在哪里实现某种“新”构造函数。我会在哪里做呢?
    • 您需要准备一个具有输入值的对象,然后在单击按钮时将其按下。就像现在一样,只有真实数据。
    【解决方案2】:

    您的数组需要在范围内。 Trythis 确保 ng-repeat 在“任务”上重复:

    app.controller('MyTasks', ['$scope', function($scope){
      $scope.tasks = [
        {
          title: "This is the title",
          completed: false
        },
        {
          title: "This is the title",
          completed: true
        },
        {
          title: "This is the title",
          completed: false
        }
      ];
    
      this.myform = {
        item: "Item Title",
        completed: false
      };
      this.addtask = function(){
        $scope.tasks.push(this.myform);
      };
    }])
    

    【讨论】:

    • 它通过'controller as' 语法限定在控制器范围内,就像在 codepen 示例中一样。它不能那样工作吗?最初的 ng-repeat 看到它很好,并且数组更新很好,只是 ng-repeat 没有更新。
    • 为了响应变化而监视的值需要在范围内。我认为您所做的是为控制器对象提供一些额外的属性,这些属性 ng-repeat 无法“监视”更改。
    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 2014-06-17
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    相关资源
    最近更新 更多