Использование Angularfire для удаления элементов todo из двух шаблонов для размещения в другом и обновления базы данных Firebase

Этот вопрос может включать использование фильтров Angular или что-то еще, о чем я не подумал. У меня возникают проблемы с удалением моих задач из одного шаблона и сохранением их в другом, когда срок действия в моем списке задач истек. Я использую angularfire для базы данных.

То, что у меня есть сейчас, это список дел, в котором содержится запрос на что-то «дело» и дату завершения. Если пользователь не выполнил задачу в течение 7 дней, задача удаляется и должна быть помещена в таблицу сроков действия. Задача с истекшим сроком действия помещается в таблицу «Просроченные задачи», за исключением того, что задача не удаляется из «текущего» списка задач.

Вопрос. Как удалить задачу из списка текущих задач, оставив ее в списке задач с истекшим сроком действия? Еще одна проблема, с которой я столкнулся, заключается в том, чтобы заставить базу данных Firebase обновить «expired» с «false» на «true». Я знаю, что он делает это в браузере, потому что я поставил на него $watch, но он не переходит в БД.

Любые подсказки будут очень признательны!

(Я думаю, что одна часть — это то, как я сделал фильтр, но есть что-то еще, что я точно упускаю.)

Внутри углового контроллера:

  $scope.addTodo = function() {
    $scope.todos.$add({
      text: $scope.newTodo,
      date: $scope.newDate,
      done: false,
      expired: false
    });
    $scope.newTodo = '';
    $scope.newDate = '';
  };   

$scope.removeTodo = function(todo) {
    $scope.todos.$remove(todo);
  };

$scope.todoChange = function(todo) {
    if(todo.done && $scope.show === 'Complete'){
       return true;
    } else if(!todo.done && $scope.show === 'Current'){
      return true;
    } else {
       return false;
    }
  };

$scope.todoExpired = function(todo) { 
  var today = new Date();
  var fDate = new Date(todo.date);
  fDate.setDate(fDate.getDate() + 7);

    if (today > fDate) {
      return true;
        } else {
      return false;
    }
  }; 

Вот частичный HTML для таблиц:

Текущая страница:

<tr class='results' ng-repeat='(id, todo) in todos | filter:todoChange'>
    <td><span>{{$index + 1}}</scan></td>
    <td><span>{{todo.text}}</span></td>
    <td><span>{{todo.date}}</span></td>
    <td><input type='checkbox' ng-model='todo.done' ng-change='todos.$save(todo)'></td>
    <td><button class='btn btn-danger' ng-click='removeTodo(todo)'>Delete</button></td>
</tr>

Срок действия страницы:

<tr class='results' ng-repeat='todo in todos | filter:todoExpired'>
    <td><span>{{$index + 1}}</scan></td>
    <td><span>{{todo.text}}</span></td>
    <td><span>{{todo.date}}</span></td>
    <td>Expired</td>
    <td><button class='btn btn-danger' ng-click='removeTodo(todo)'>Delete</button></td>
</tr>

ОБНОВЛЕНИЕ:

Выяснил, что мне нужно было поместить ng-hide='todoExpired(todo)' в таблицу. Это сделало все задачи с истекшим сроком действия скрытыми на текущей странице и просматриваемыми только на странице с истекшим сроком действия.


person A. J. Alger    schedule 10.10.2014    source источник


Ответы (1)


Итак, я понял это через $watch() и добавление ng-hide='todoExpired(todo)' в «текущую» таблицу.

Код watch() выглядит следующим образом:

$scope.todos.$watch(function(newValue, oldValue) {
   if(oldValue == newValue) {return;}
   _.each($scope.todos, function(element, item, index) {
    if ($scope.todoExpired(element)) { 
     element.expired = true;
     $scope.todos.$save(element);
   } 
  })
});

Я не знаю, насколько эффективен этот ответ, но он помогает.

person A. J. Alger    schedule 10.10.2014
comment
Что проверяет todoExpered(todo)? Совершенно не обязательно иметь здесь событие $watch, так как ng-hide будет автоматически вызывать todoExpired() при каждом изменении данных. - person Kato; 13.10.2014
comment
Да, ng-hide делает свое дело, но использование ng-hide не обновляет значение «true» в базе данных Firebase для свойства «expired». Если вы знаете способ, которым намного проще обновить свойство в БД, я бы хотел знать во что бы то ни стало. Не буду притворяться, я пользуюсь Firebase всего две недели, javascript выучил около месяца назад, а angular три недели назад. Так что я в лучшем случае любитель. - person A. J. Alger; 13.10.2014