【问题标题】:Splice removing wrong object from ng-repeat in AngularJS拼接从AngularJS中的ng-repeat中删除错误的对象
【发布时间】:2014-12-02 02:41:19
【问题描述】:

我在我的视图中列出了一个名称数组,如下所示:

<div class="checkbox col-md-3" ng-repeat="staff in stafflist | orderBy: 'name'">
  <div class="checkboxinner">

    <button class="btn btn-staff form-control" 
            ng-show="!staff.chosen" 
            ng-click="pushStaff(staff)">
               {{staff.name}}
    </button> // visible when unselected, invisible when selected 

    <button class="btn btn-primary form-control" 
            ng-show="staff.chosen" 
            ng-click="unpushStaff(staff, $index)">
               {{staff.name}}
    </button> // visible when selected, invisible when unselected

  </div>
</div> 

第一个按钮触发此功能,将对象添加到数组中并被另一个按钮(不同颜色,相同内容)替换,该按钮应该用作切换。此功能完美运行。

$scope.paxlist = [];

$scope.pushStaff = function (staff) {
    staff.chosen = true;

    $scope.paxlist.push(
        {
            name: staff.name
        }
    );
    console.log($scope.paxlist);
};

基本上,当我单击时,我添加了对象,当我再次单击时,我将其删除。这是删除功能:

$scope.unpushStaff = function (staff, $index) {
    staff.chosen = false;

    var index=$scope.paxlist.indexOf(staff)
    $scope.paxlist.splice(index,1);   

    console.log($scope.paxlist);
}

我的问题是 unpushStaff() 确实会删除一个项目,但不是我点击删除的项目,而是另一个。

我错过了什么?

也许 ng-show 弄乱了 $index?

【问题讨论】:

  • 我在控制器中看到paxlist,在模板中看到stafflist。两者之间有什么联系?
  • 模板中的@deitch 我列出了stafflist中的所有项目,然后我希望能够选择其中一些并将它们添加到另一个数组(paxlist)中。
  • 哦,所以模板是用于从人员列表中挑选并从单独的 paxlist 中添加/删除?当您执行unpushStaff() 时,您看到了什么?正在删除哪个项目?
  • 哦,我刚刚想通了。
  • 例如,我选择abc。然后我取消选择 b 并且 paxlist 将保留为 [a, b] 而不是 [a,c]

标签: javascript arrays angularjs angularjs-ng-repeat ng-repeat


【解决方案1】:

stafflist 中的 staff 条目与 paxlist 中的条目不相同。根据您的以下模板:

    <button class="btn btn-staff form-control" 
        ng-show="!staff.chosen" 
        ng-click="pushStaff(staff)">
           {{staff.name}}
    </button> // visible when unselected, invisible when selected 

很明显,stafflist 中的每个staff 条目都是某种对象,它至少具有一个属性name 和另一个chosen

当您推送到 paxlist 时,您正在创建一个 对象,如下所示:

$scope.paxlist.push(
    {
        name: staff.name
    }
);

这很好。 但是当你来删除它时,你正在寻找它:

    var index=$scope.paxlist.indexOf(staff)

其中staff人员列表中的对象!当然,该对象在 paxlist 中不存在 - 您在上面在 paxlist.push() 中派生的一个单独对象是 - 所以 indexOf() 正在返回 -1,导致 splice() 删除 paxlist 上的最后一项。

【讨论】:

  • 我实际上开始朝同一个方向思考。但是我该如何解决呢??
  • 一堆方法。最简单的可能是将实际对象staff 推送到paxlist。如果它是实际对象(不是属性恰好匹配的另一个对象),那么indexOf 将起作用。否则,您将需要一一搜索(这就是 indexOf 所做的一切)。 lodash 中有一些不错的工具
  • 这样的答案让我真正学到了一些东西:)
  • 所以正在弄清楚它们并编写它们。这实际上就是我把时间花在这里的原因。 :-) 好好利用。
猜你喜欢
  • 2015-11-29
  • 2015-11-05
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多