【问题标题】:AngularJS ng-repeat track by not selecting initial valueAngularJS ng-repeat 通过不选择初始值来跟踪
【发布时间】:2014-10-10 18:49:17
【问题描述】:

对于 Angular 来说还是个新手,所以请多多包涵。我有一个使用 ng-repeat 生成的单选按钮列表。我将所选对象存储在同一控制器上的单独变量中。

所选对象正在设置为列表中对象之一的不同实例。我认为由于 ID 相同,使用“track by”表达式会在列表中选择正确的项目,但事实并非如此。 如果我选择一个单选按钮,它将按预期更新所选变量。

我做错了吗?这是一个糟糕的模式吗?

<form name="myForm" ng-controller="MyCtrl">
  <label ng-repeat="person in people track by person.id">
      <input type="radio" ng-model="$parent.selected" ng-value="person" />
      {{person.name}}
  </label>
</form>

这是我的控制器:

angular.module('ngAppDemo', []).controller('MyCtrl', MyCtrl)

function MyCtrl($scope) {
    $scope.selected = { id: 2, name: "Paul" };
    $scope.people = [
        { id: 1, name: "John" }, 
        { id: 2, name: "Paul" }, 
        { id: 3, name: "George" }, 
        { id: 4, name: "Frank" }
    ];
}

这是我的Plunker

更新:
我认识到如果我使用来自同一个集合的对象,它将起作用。但是,这不是我目前的设置方式。我用于“选定”的实例来自不同的函数,因此并非来自给定的列表。

【问题讨论】:

标签: javascript angularjs angularjs-ng-repeat


【解决方案1】:

现在它已经修复了:

http://plnkr.co/edit/LWXe4dFzfdqTOZXmatpQ?p=preview

您只需要确保选定的点指向列表中的某个内容。它不按值进行比较,而是按引用进行比较。

function MyCtrl($scope) {
$scope.people = [
    { id: 1, name: "John" }, 
    { id: 2, name: "Paul" }, 
    { id: 3, name: "George" }, 
    { id: 4, name: "Frank" }
];
$scope.selected = $scope.people[1];
}

更新 您所要做的只是自己编写匹配例程以匹配 ID 上的任何其他生成它自己的对象的函数,并在 $scope.people 列表中找到相同的对象。例如:

function findSelectedPerson( selected ) {
    for( var i = 0; i < $scope.people.length; i++ ) {
        if( $scope.people[i].id == selected.id ) return $scope.people[i];
    }
    return null;
}

这样就解决了。

【讨论】:

  • 感谢您的回复。看我的更新。我想我需要想办法解决这个问题。
  • 感谢您的更新,这几乎就是我最终要做的……有一种方法可以让它自动执行此操作。
【解决方案2】:

提示

$scope.selected = { id: 2, name: "Paul" };
$scope.people = [
    { id: 1, name: "John" }, 
    { id: 2, name: "Paul" }, 
    { id: 3, name: "George" }, 
    { id: 4, name: "Frank" }
];

console.log($scope.selected == $scope.people[1]) // false

$scope.selected 与 $scope.people 中的任何内容都不匹配

【讨论】:

  • 感谢您的回复。无需提示,我知道这两个对象不相等。 :( 我试图按值使用跟踪来寻找匹配项。
猜你喜欢
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 2014-12-31
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多