编辑几个ng-repeat

时间:2016-01-12 17:12:02

标签: angularjs angularjs-ng-repeat

我有两个ng-repeat显示对象调用' post',我有一个用于编辑文本并更新它的按钮。 一切正常,但我仍然有一个小问题,这是HTML代码:

  <li ng-repeat="post in posts | filter: {  etat: 'aTraiter' } ">

    <p ng-show="!editing[$index]" ng-model  href="#/{{post._id}}">{{ post.corps }}</p>
    <input ng-show="editing[$index]" type="text" ng-model="post.corps">

    <a  ng-show="!editing[$index" ng-click="edit(post)">Editer</a>
    <a  ng-show="editing[$index]" ng-click="update(post)">Confirmer</a>
    <a ng-show="editing[$index]" ng-click="cancel(post)">Annuler</a>
  </li>

  <li ng-repeat="post in posts | filter: {  etat: 'enCours' } ">

    <p ng-show="!editing[$index]" ng-model  href="#/{{post._id}}">{{ post.corps }}</p>
    <input ng-show="editing[$index]" type="text" ng-model="post.corps">


    <a ng-show="!editing[$index]" ng-click="edit(post)">Editer</a>
    <a ng-show="editing[$index]" ng-click="update(post)">Confirmer</a>
    <a ng-show="editing[$index]" ng-click="cancel(post)">Annuler</a>
  </li>

控制器:

 $scope.editing = [];
$scope.posts= Posts.query();

   $scope.edit = function(post){
        var idx = $scope.posts.indexOf(post);
        $scope.editing[idx] = angular.copy($scope.posts[idx]);
    }

    $scope.update = function(post){
        var idx = $scope.posts.indexOf(post);
        Posts.update({id: post._id}, post);
        $scope.editing[idx] = false;
    }

    $scope.cancel = function(post){
        var idx = $scope.posts.indexOf(post);
        post = angular.copy(post);
        $scope.editing[idx] = false;
    }

如果我只有一个帖子,我可以编辑它,一切正常。

但是,当我在两次ng-repeat中找到一个帖子时,我得到了一些错误,如果我点击编辑,按钮会在两次ng-repeat中改变,并且两个帖子都可以编辑。

我不确定,但我认为这是我的问题:

ng-show="editing[$index]"

我尝试把帖子的索引像这样

ng-show="editing[posts.indexOf(post)]"

但这不起作用,有人可以帮助我吗?

jsfiddle链接)

编辑帖子查询:

    Posts.query();: Array[0]
    0: d
    __v: 0
    _id: "569563a96a81e64409623179"
    corps: "asdad"
    etat: "enCours"
    nomReseau: "Google+"
    section: "evolution"
    __proto__: d
    1: d
    __v: 0
    _id: "56954e676a81e6440962316b"
    corps: "sdfsdfsf"
    etat: "enCours"
    nomReseau: "Google+"
    section: "evolution"
    __proto__: d

2 个答案:

答案 0 :(得分:1)

你正在使用$ index,这只是......好吧......一个索引。两个集合都可以在index == 1处有一个值,对吧?因此, $ index在整个帖子集中并不是唯一的

幸运的是,您似乎每个帖子都有一个似乎唯一的ID: post._id 。那怎么用呢?

一个小小的注意事项 - 我在下面使用jquery的grep方法来查找Id的帖子。这很好,但我更喜欢underscore.js。看看两个......

所以,这是你的控制器代码:

//This is me willfully and wantonly changing your variables ... sorry.
$scope.selectedPost = undefined;
$scope.selectedPost_unchanged = undefined;
//This is the same, though, so you should feel good ;-)
$scope.posts= Posts.query();

   $scope.edit = function(postId){
       var result = $.grep($scope.posts, function(p){ return p._id == postId; });
       if(result.length==0) { return; }
       //just store the one we are editing.  that should be cool, right?
       $scope.selectedPost = results[0];
       //ok... im changing this too... see if you like it better?
       //we're gonna use it in the CANCEL method (below).
       $scope.selectedPost_unchanged = angular.copy(results[0]);
    }

    $scope.update = function(post){
        Posts.update({id: post._id}, post);
        $scope.selectedPost = undefined;
        $scope.selectedPost_unchanged = undefined;
    }

    $scope.cancel = function(post){
        post = angular.extend({}, $scope.selectedPost_unchanged);
        $scope.selectedPost = undefined;
        $scope.selectedPost_unchanged = undefined;
    }

    //This is new too ... just adding it so that the html is clearer.
    $scope.isEditing = function(post) {
        if($scope.selectedPost==undefined) { return false; }
        return post._id == $scope.selectedPost._id;
    }

HTML也有所改变

您的所有editing[$index]代码都只是isEditing(post)

瞧!除了可能使用css + ng-class ...

不是没有,但我会使用css添加while编辑/不编辑显示/隐藏。然后,将一个ng-class添加到li元素中(例如 - ng-class="{editing: isEditing(post)}")。然后,用css照顾你所有的表演/隐藏。这样,您只需将isEditing(post)放在html中的一个位置(而不是将其添加到每个元素)。 ng标签并不昂贵,但它们真的在ng-repeat标签内加起来。

答案 1 :(得分:1)

在过滤后的重复中使用$ index来访问数组中的信息。

使用$ index,将其传递给控制器​​,然后尝试使用该索引在帖子数组中搜索“帖子”的问题是$index引用了您的视图索引,而不是< em> true 数组中项目的索引。

传统上这不是问题,除非您使用ng-repeat过滤数组。为什么?因为$ index不反射项的索引,而是该项如何出现在DOM中的索引。因此,虽然第一个渲染的帖子在你的posts数组中可能有索引5,但它仍然会有$index为0,因为它是ng-repeat中的第一个渲染项。

解决方案:首先将数据分成两个独立的数组,然后逐个重复。

控制器:

$scope.posts = Posts.query();

$scope.postsATraiter = $scope.posts.filter(function(item, index) {
  return item.etat === 'aTraiter';
});

$scope.postsEnCours = $scope.posts.filter(function(item, index) {
  return item.etat === 'enCours';
})

$scope.edit = function(post, postType){
    var idx = getPostsByType(postType).indexOf(post);
    $scope.editing[idx] = angular.copy($scope.posts[idx]);
}

$scope.update = function(post, postType){
    var idx = getPostsByType(postType).indexOf(post);
    Posts.update({id: post._id}, post);
    $scope.editing[idx] = false;
}

$scope.cancel = function(post, postType){
    var idx = getPostsByType(postType).indexOf(post);
    post = angular.copy(post);
    $scope.editing[idx] = false;
}

function getPostsByType(postTypeString) {
  if (postTypeString === 'aTraiter') {
    return $scope.postsATraiter;
  } else {
    return $scope.postsEnCours;
  }
}

现在数据是独立的,你可以自由使用$ index,因为我们知道$ index将尊重数组中项的真实索引,因为它没有被过滤。

  <li ng-repeat="post in postsATraiter">
    <p ng-show="!editing[$index]" ng-model  href="#/{{post._id}}">{{ post.corps }}</p>
    <input ng-show="editing[$index]" type="text" ng-model="post.corps">

    <a  ng-show="!editing[$index" ng-click="edit(post, 'aTraiter')">Editer</a>
    <a  ng-show="editing[$index]" ng-click="update(post, 'aTraiter')">Confirmer</a>
    <a ng-show="editing[$index]" ng-click="cancel(post,'aTraiter')">Annuler</a>
  </li>

  <li ng-repeat="post in postsEnCours">
    <p ng-show="!editing[$index]" ng-model  href="#/{{post._id}}">{{ post.corps }}</p>
    <input ng-show="editing[$index]" type="text" ng-model="post.corps">


    <a ng-show="!editing[$index]" ng-click="edit(post, 'enCours')">Editer</a>
    <a ng-show="editing[$index]" ng-click="update(post, 'enCours')">Confirmer</a>
    <a ng-show="editing[$index]" ng-click="cancel(post, 'enCours')">Annuler</a>
  </li>

您可能不得不更多地使用您的实现,但似乎$ index及其使用方式可能是您遇到的问题的根源。