Странная ошибка с ng-repeat и фильтром

0

Я использую NodeJS, ANgularJS и MongoDB с мангустами

Вот моя модель:

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

У меня есть функция, которая меняет атрибут ethat:

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

Я использую ng-repeat для объекта show в моей базе данных:

<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>

Я могу видеть все сообщения в моей базе данных, и когда я нажимаю на кнопку, это отлично работает с атрибутом ethat, и все в порядке.

Но когда я добавляю фильтр в ng-repeat, вот так:

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

Фильтр отлично работает. У меня есть все сообщения с атрибутом ethat: 'aTraiter'

Но если я нажму на свою предыдущую кнопку и измените атрибут ethat, ничего не изменится, и я попытаюсь использовать другие функции, которые все они работают с фильтром, но когда я ничего не скажу.

3 ответа

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 напрямую. Таким образом, в вашей функции passer вы можете сделать это

post.editing = false;

и, на ваш взгляд

ng-show="!post.editing"

таким образом вы не будете использовать $index и вы предотвратите все проблемы с обновлением фильтрами

0

Есть ошибки в AngularJS v1.4, где в определенных ситуациях ng-repeat прерывается. Я обновился до версии 1.6, и он ушел.

0

У вас есть какие-либо контроллеры/службы, которые обращаются к $scope.editing? Если это так, вы можете установить $scope.editing[$index] равным предыдущему состоянию, где оно не равно false. Вы также можете подумать, что вы предполагаете $scope.editing[$index] будет логическим. если он имеет какой-либо другой тип, такой как строка или число, то он будет оценивать значение true.

В противном случае ни один из ваших результатов не имеет атрибута ethat, равного 'aTraiter', поэтому они не отображаются. Вы подтвердили, что у любого из них действительно есть etat, равный 'aTraiter'. Вы можете изменить это значение где-то еще. Возможно, из функции Пасса

  • 0
    да у меня контроллер все работает, и все посты с атрибутом etat равным 'aTraiter' показывают. Просто когда я ставлю фильтр, это просто функции, которые не работают, но визуал отличный.
  • 0
    Попробуйте отладку, добавив что-нибудь, что будет отображать атрибут etat и значение $ scope.editing [$ index]. Затем удалите фильтр и запустите программу. После того, как вы нажмете предыдущую кнопку, посмотрите на их значения и посмотрите, ожидаете ли вы их.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню