我有两个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
答案 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;
}
您的所有editing[$index]
代码都只是isEditing(post)
不是没有,但我会使用css添加while编辑/不编辑显示/隐藏。然后,将一个ng-class添加到li元素中(例如 - ng-class="{editing: isEditing(post)}"
)。然后,用css照顾你所有的表演/隐藏。这样,您只需将isEditing(post)放在html中的一个位置(而不是将其添加到每个元素)。 ng标签并不昂贵,但它们真的在ng-repeat标签内加起来。
答案 1 :(得分:1)
使用$ 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及其使用方式可能是您遇到的问题的根源。