Angular - объект ресурса иногда не определен?

У меня есть простое приложение, использующее Angular, которое использует ресурсы Tastypie REST.

У меня есть ресурс, определенный с использованием фабрики:

app.factory("Task", function($resource) {
    return $resource("/api/v1/task/:id/", {scheduling: '@scheduling', meta_only: '@meta_only'});
  });

и простой контроллер с несколькими функциями:

app.controller("TasksController", function($scope, Task){

   Task.get(function(data){ 
       $scope.tasks = data.objects;
   });

   $scope.markAsDone = function(task){
       task.is_done = true;
       task.$save();
   }
}

View имеет простой ng-repeat задач и флажок, который вызывает markAsDone(task) при ng-change. Есть еще несколько подобных простых функций.

Теперь время от времени я получаю сообщение об ошибке "undefined is not a function" при вызове task.$save(). Я не могу понять, когда и почему я получаю и не получаю эту ошибку, поскольку иногда она работает так, как ожидалось. Мне удалось зарегистрировать «задачу» в функции в обоих случаях, и, конечно же, когда происходит ошибка, это объект, а когда нет, у него есть все эти свойства и функции, определенные, которые использует Angular.

Что мне не хватает?


person eagerMoose    schedule 14.12.2014    source источник
comment
Возможно, вы столкнулись с проблемами асинхронной загрузки, в основном, когда $resource не завершен, вы уже вызываете вывод. Способ справиться с этим - использовать обратные вызовы. Проверьте модуль angular $q или найдите асинхронный AngularJS в Stackoverflow.   -  person AMG    schedule 15.12.2014
comment
Я не думаю, что это все. Я вызываю $save(), когда мой объект уже подготовлен.   -  person eagerMoose    schedule 15.12.2014
comment
Понял, я с ним не совсем знаком. Из любопытства, не могли бы вы объяснить, как вы это делаете? Я не вижу этого непосредственно из кода.   -  person AMG    schedule 15.12.2014
comment
Я работаю со списком задач, загружаемых с помощью функции Task.get(). Как только задачи загружены, они сохраняются в области действия — это то, что делает первая часть в контроллере. Вторая часть определяет функцию, которая вызывается, когда пользователь щелкает флажок в представлении. Он привязан к задаче (задаче из списка, загруженного в первой части кода).   -  person eagerMoose    schedule 15.12.2014
comment
Понятно. Единственная часть, которую я не понимаю, - это то, где вы определяете, что происходит при загрузке задач, например, я не вижу обратных вызовов .then или .success (все еще изучаю эту тему). Вот почему я думал, что вы имеете дело с асинхронной загрузкой.   -  person AMG    schedule 15.12.2014
comment
О, да, извините. Безымянная функция в Task.get(function(){}); это обратный вызов успеха. Другими словами, когда get успешно завершается, выполняется функция внутри скобок.   -  person eagerMoose    schedule 15.12.2014
comment
Спасибо за ответ на МОЙ вопрос :)   -  person AMG    schedule 15.12.2014
comment
Вероятно, это неверно для вашего случая, но я сломал DI, когда Function.prototype использовался в качестве контроллера, что в конце концов было довольно глупо. После того, как Angular добавит к нему $inject, все последовательные вызовы annotate ничего не добавляют, потому что $inject уже находится в цепочке прототипов.   -  person Klaster_1    schedule 02.07.2015


Ответы (1)


Добавить чек как

$scope.markAsDone = function(task){
   if(typeof task !== undefined){
      task.is_done = true;
      task.$save();
   }
}
person Akshay Anand    schedule 11.09.2015