Вопрос по rest, javascript, angularjs, html – Обещание по сохранению ресурса AngularJS

19

В настоящее время я работаю над приложением 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 правильный. Возвращает сохраненный объект.

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

Привет, Это совершенно не связано с вопросом, а просто интересно, какую библиотеку FlashMessage вы используете. Мигает ли предупреждение, даже когда состояние изменилось? Буду удалять этот комментарий позже. Hussain
Вы называете хороший курс. $ save ()? Здесьcourse из $ ресурса и из параметров.course.saveCourse = function(course) Utopik
Я звоню тот из параметров. Это неправильно? Или как другой (из ресурса) мог узнать, что сохранить? mooonli

Ваш Ответ

5   ответов
0

но вы можете иметь 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");
});
42

один для работы с экземпляром ресурса и - в отсутствие лучших слов - более универсальная версия. Основное отличие заключается в использовании$методы с префиксом (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") });
Не уверен, что я делаю неправильно, но любая комбинация save, $ save, затем и $ then не работает и приводит к ошибке. Я использую 1.0.8 Вы уверены, что это должно работать так? HMR
являетсяResource.$get() такой же какResource.get().$promise ? Magne
1

Это для 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);
  });
};
$save возвращает объект с методами обещания. Вы можете избежать создания дополнительного отложенного объекта, просто написавreturn s.$save();. jbielick
@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) HMR
3

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

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

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

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

0

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

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

function doCrudOpWithPromise(resourceInstance, crudOpName){
            var def=$q.defer()
            resourceInstance['$'+crudOpName](function(res){def.resolve(res)}, function(err){def.reject(err)})
            return def.promise
}

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

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

Похожие вопросы