Не могу понять, почему ng-ресурс не возвращает массив

Я использую AngularJS и NGResource и не могу понять, почему, когда я использую запрос, я продолжаю возвращать пустой массив.

В моем контроллере я делаю

Task = $resource('/tasks'); 
var tasks = Task.query(function () {});
console.log(tasks);
$scope.tasks = tasks;

В представлении

{{tasks}}

В представлении он отображается правильно

[{"created_at":"08/08/2013","created_by_id":2,"description":"description","id":1,"name":"test task 1","parent_task_id":null,"task_type_id":1,"updated_at":"08/08/2013"},
{"created_at":"08/08/2013","created_by_id":2,"description":"description","id":2,"name":"test task 2","task_type_id":1,"updated_at":"08/08/2013"}]

но в консоли он регистрируется как пустой массив:

[]

Кроме того, я использую расширение Batarang для Chrome и область, в которой он показывает задачи как:

tests: 
  [  ]

Мне нужно выполнить некоторые операции с данными над возвращенным значением, прежде чем поместить его в модель $ scope. Это типичное поведение и есть что-то, чего мне не хватает? Или я что-то не так делаю? Любые идеи будут благодарны. Я застрял на этом слишком долго.

1 ответ

Решение

Вы регистрируете пустой массив до того, как он будет заполнен асинхронным результатом AJAX.

Часть волшебства Angular в том, что он автоматически обновит tasks массив с новыми данными, как это происходит по проводам, а также автоматическое обновление представления.

В качестве доказательства попробуйте это:

var Task = $resource('/tasks');

$scope.tasks = Task.query(function () {});;

$scope.$watch('tasks', function (value) {
    console.log(value);
});

Вот цитата из документов:

Важно понимать, что вызов метода объекта $resource немедленно возвращает пустую ссылку (объект или массив в зависимости от isArray). Как только данные возвращаются с сервера, существующая ссылка заполняется фактическими данными. Это полезный прием, так как обычно ресурс назначается модели, которая затем визуализируется представлением. Наличие пустого объекта не приводит к визуализации, как только данные поступают с сервера, тогда объект заполняется данными, и представление автоматически повторно отображает себя, показывая новые данные. Это означает, что в большинстве случаев никогда не нужно писать функцию обратного вызова для методов действия.

Другие вопросы по тегам