Я использую 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, ничего не изменится, и я попытаюсь использовать другие функции, которые все они работают с фильтром, но когда я ничего не скажу.
Проблема в том, что $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
и вы предотвратите все проблемы с обновлением фильтрами
Есть ошибки в AngularJS v1.4, где в определенных ситуациях ng-repeat прерывается. Я обновился до версии 1.6, и он ушел.
У вас есть какие-либо контроллеры/службы, которые обращаются к $scope.editing
? Если это так, вы можете установить $scope.editing[$index]
равным предыдущему состоянию, где оно не равно false. Вы также можете подумать, что вы предполагаете $scope.editing[$index]
будет логическим. если он имеет какой-либо другой тип, такой как строка или число, то он будет оценивать значение true.
В противном случае ни один из ваших результатов не имеет атрибута ethat, равного 'aTraiter', поэтому они не отображаются. Вы подтвердили, что у любого из них действительно есть etat, равный 'aTraiter'. Вы можете изменить это значение где-то еще. Возможно, из функции Пасса