ng-repeat和过滤器的奇怪错误

时间:2015-12-08 22:30:40

标签: angularjs node.js mongodb

我正在使用带有mongoose的NodeJS,ANgularJS和MongoDB

这是我的模特:

var PostSchema = new mongoose.Schema({
    nomReseau : String,
    corps : String,
    etat : String,
    section : String
});

我有一个改变属性etat的函数:

$scope.passer = function(index){
    var post = $scope.posts[index];
    post.etat = "enCours";
    Posts.update({id: post._id}, post);
    $scope.editing[index] = false;
}

我在我的数据库中使用了ng-repeat for show object:

<ul>
    <li ng-repeat="post in posts ">
        <p>
            <a ng-show="!editing[$index]" href="#/{{post._id}}">{{post.corps}}</a>
        </p>
        <button ng-show="!editing[$index]" ng-click="passer($index)">Passer</button>
    </li>
</ul>

我可以看到我的数据库中的所有帖子,当我点击按钮时,这完全适用于属性etat更改,一切都很好。

但是当我在ng-repeat中添加一个过滤器时,就像这样:

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

过滤器工作得很好我发布了所有的etat属性:'aTraiter'

但是,如果我点击我的上一个按钮并更改属性etat没有任何变化,我尝试使用其他功能,他们都可以使用过滤器,但是当我说它没什么用。

3 个答案:

答案 0 :(得分:0)

您是否有任何访问$scope.editing的控制器/服务?如果是这样,您可能将$scope.editing[$index]设置为等于之前的状态,其中它不等于false。您可能还想考虑您假设$scope.editing[$index]将是一个布尔值。如果它有任何其他类型,如字符串或数字,那么它将评估为true。

否则您的所有结果都没有etat属性等于&#39; aTraiter&#39;所以他们没有表现出来。你有没有证实他们中的任何一个确实有etat等于&#39; aTraiter&#39;。您可能正在其他地方更改该值。可能来自Passer功能

答案 1 :(得分:0)

AngularJS v1.4中存在错误,在某些情况下ng-repeat会中断。我升级到v1.6并且它消失了。

答案 2 :(得分:0)

问题是,如果显示的数据较少,$index会发生变化(因为您正在过滤)。您可以直接使用post变量

ng-click="passer(post)"

你的功能应该是

$scope.passer = function(post){
    post.etat = "enCours";
    Posts.update({id: post._id}, post);
    var index = $scope.posts.findIndex(function(p) { /* comparison to get original index */ }); /* keep in mind findIndex is not supported on IE, you might want to use filter or for loop instead) */
    $scope.editing[index] = false;
}

你可以直接处理post变量的编辑。所以在你的路人功能中你可以这样做

post.editing = false;

并在您的视图中

ng-show="!post.editing"

这样您就不会使用$index,并且可以防止过滤器更新所有问题