Обещание по сохранению ресурса AngularJS

В настоящее время я работаю над приложением REST + AngularJS.

У меня есть небольшая проблема, связанная с обещаниями по сохранению ресурсов.

Моя фабрика:

App.factory('Course', function($resource) {
    var course = $resource('/AppServer/admin/courses/:courseId', {}, {});

    course.findAll = function() {
        return course.query();
    };

    course.findById = function(id) {
        return course.get({
            courseId : id
        });

    };

    course.saveCourse = function(course) {
        return course.$save();
    }

    return course;
});

Мой контроллер:

App.controller('CourseEditController', function($scope, $routeParams, $location, Course, FlashMessage) {
    // load course into edit form
    $scope.course = Course.findById($routeParams.courseId);

    // save edited course and print flash message
    $scope.saveCourse = function() {
        var savedCourse = Course.saveCourse($scope.course);

        savedCourse.$then(function(httpResponse) {
            FlashMessage.set("Die Änderungen am Kurs <i>" + savedCourse.title + "</i> wurden erfolgreich gespeichert.");
            $location.path("/kurse/verwalten");
        });
    }
}); 

Теперь проблема в том, что я получаю следующее исключение:

TypeError: Cannot call method '$then' of undefined

Странно то, что если я добавляю один и тот же обратный вызов к одному из искателей (например, findById), все работает нормально. Но возвращаемое значение «return course. $ Save ()» не определено по сравнению с возвращаемым значением «return course.get ({courseId: id}));» который является «Объектом объекта».

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

Есть идеи по этому поводу? Ответ от моей службы REST правильный. Возвращает сохраненный объект.

Приветствует Марк

 Utopik16 июн. 2013 г., 11:10
Вы называете хороший курс. $ save ()? Здесьcourse из $ ресурса и из параметров.course.saveCourse = function(course)
 mooonli16 июн. 2013 г., 11:24
Я звоню тот из параметров. Это неправильно? Или как другой (из ресурса) мог узнать, что сохранить?
 Hussain03 июн. 2015 г., 17:06
Привет, Это совершенно не связано с вопросом, а просто интересно, какую библиотеку FlashMessage вы используете. Мигает ли предупреждение, даже когда состояние изменилось? Буду удалять этот комментарий позже.

Ответы на вопрос(5)

ресурс это упоминает

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

Это вполне может означать, что ваш вызов $ save вернет пустую ссылку. Такжеthen недоступна в Resource API до Angular 1.2, поскольку ресурсы недоступныpromise исходя из.

Вы должны изменить свойsaveCourse вызов метода, чтобы принять параметр функции для успеха и выполнить там необходимые действия.

Это для Angularjs 1.0.8

В моем сервисе у меня есть следующее:

angular.module('dataProvider', []).
  factory('dataProvider', ['$resource','$q',function($resource,$q) { 
//....
var Student = $resource('/app/student/:studentid',
    {studentid:'@id'}
);
    return {
      newStudent:function(student){
        var deferred = $q.defer();
        var s = new Student({name:student.name,age:parseInt(student.age)});
        s.$save(null,function(student){
            deferred.resolve(student);
        });
        return deferred.promise;
      }
    };
}]);

В моем контроллере:

$scope.createStudent=function(){
  dataProvider.newStudent($scope.newStudent).then(
    function(data){
      $scope.students.push(data);
  });
};
 jbielick13 авг. 2014 г., 21:30
$save возвращает объект с методами обещания. Вы можете избежать создания дополнительного отложенного объекта, просто написавreturn s.$save();.
 HMR14 авг. 2014 г., 14:49
@jbielick Давным-давно я добавил этот код, чтобы вернуть обещание, потому что 1.0.8 этого не сделал.github.com/angular/code.angularjs.org/blob/master/1.0.8/... (строка 420) по сравнению сgithub.com/angular/code.angularjs.org/blob/master/1.2.9/... (строка 574)

один для работы с экземпляром ресурса и - в отсутствие лучших слов - более универсальная версия. Основное отличие заключается в использовании$методы с префиксом (get против$get)

$методы с префиксом вngResource / resource.js, прокси-вызов и возвращает обещание напрямую.

AFAIK, прежде чем ресурс будет создан, вы можете получить доступ к ресурсам только с обычнымget.

var promise = Resource.get().$promise;

promise.then(function(res)  { console.log("success: ", res); });
promise.catch(function(res) { console.log("error: ", res); });

С созданным ресурсом$доступны методы с префиксом:

var res = new Resource({foo: "bar"});

res.$save()
    .then(function(res)  { console.log("authenticated") })
    .catch(function(req) { console.log("error saving obj"); })
    .finally(function()  { console.log("always called") });
 HMR06 окт. 2013 г., 05:45
Не уверен, что я делаю неправильно, но любая комбинация save, $ save, затем и $ then не работает и приводит к ошибке. Я использую 1.0.8 Вы уверены, что это должно работать так?
 Magne10 июл. 2014 г., 13:23
являетсяResource.$get() такой же какResource.get().$promise ?

но вы можете иметь callabck на $ save ...

var savedCourse = Course.saveCourse($scope.course);

savedCourse.$save(function(savedCourse, putResponseHeaders) {
    FlashMessage.set("Die Änderungen am Kurs <i>" + savedCourse.title + "</i> wurden erfolgreich gespeichert.");
    $location.path("/kurse/verwalten");
});

чтобы ресурс имел обещание, когда он выполняет операцию CRUD.

Метод заключается в следующем:

function doCrudOpWithPromise(resourceInstance, crudOpName){
            var def=$q.defer()
            resourceInstance['

Пример вызова:

var t=new MyResource()
doCrudOpWithPromise(t,'save').then(...)
+crudOpName](function(res){def.resolve(res)}, function(err){def.reject(err)}) return def.promise }

Пример вызова:

var t=new MyResource()
doCrudOpWithPromise(t,'save').then(...)

Ваш ответ на вопрос