Actualmente estoy trabajando en un DESCANSO + AngularJS aplicación.

Tengo un pequeño problema con respecto a las promesas sobre el recurso de acción de guardar.

Mi Fábrica:

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;
});

Mi Controlador:

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");
        });
    }
}); 

Ahora el problema es que me sale el siguiente excepción:

TypeError: Cannot call method '$then' of undefined

Lo extraño es que Si puedo agregar la misma, entonces-devolución de llamada a uno de los buscadores (por ejemplo, findById) todo funciona bien. Pero el valor de retorno de «el retorno del curso.$guardar()» no está definido, en comparación con el valor de retorno de «el retorno del curso.get({identificador de curso:id});» que es «Objeto».

Lo que quiero es configurar el FlashMessage cuando la acción de guardar era totalmente ejecutado y no antes de eso.

Alguna idea sobre esto? La respuesta de mi servicio REST es correcta. Devuelve el objeto guardado.

Saluda
Marc

  • se le llama el buen curso.$guardar() ? No es la course de $recursos y uno de los parámetros. course.saveCourse = function(course)
  • Estoy llamando al uno de los parámetros. Es que mal? O ¿cómo podría el otro (de los recursos) a saber qué ahorrar?
  • Hola, Este es totalmente ajena a la pregunta, pero solo me pregunto que FlashMessage biblioteca está utilizando. Qué flash de alerta de mensaje, incluso cuando el estado ha cambiado? Eliminar este comentario posterior.
InformationsquelleAutor mooonli | 2013-06-16

5 Comentarios

  1. 42

    Hay dos ligeramente diferente de la API, uno para trabajar con una instancia de recurso y en la falta de mejores palabras – más de la versión genérica. La diferencia principal será el uso de $-el prefijo métodos (get vs $get)

    La $-el prefijo métodos en ngResource/resource.js. los servidores proxy de la llamada y devuelve la promesa directamente.

    AFAIK antes de que el recurso se presenta instanciated, sólo puede acceder a los recursos con el normal get.

    var promise = Resource.get().$promise;
    
    promise.then(function(res)  { console.log("success: ", res); });
    promise.catch(function(res) { console.log("error: ", res); });

    Con instanciated de recursos de la $-el prefijo métodos están disponibles:

    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") });
    • No está seguro de lo que estoy haciendo mal pero cualquier combinación de guardar, $guardar, y $luego no funciona, da un error. Yo estoy usando el 1.0.8 Son usted seguro de que se supone que funciona así?
    • es Resource.$get() la misma como Resource.get().$promise ?
  2. 3

    Si usted mira angular de la documentación en de recursos menciona

    Es importante darse cuenta de que la invocación de un $objeto de recurso de método
    inmediatamente devuelve un vacío de referencia (objeto o matriz dependiendo de
    isArray). Una vez que los datos devueltos por el servidor de la existente
    de referencia se rellena con los datos reales.

    Esto puede muy bien significa que la llamada a $ahorre retorno vacío de referencia. También then no está disponible en los Recursos de la api antes Angular 1.2 como los recursos no son promise base.

    Usted debe cambiar su saveCourse llamada al método acepta un parámetro de función para el éxito y hacer las acciones necesarias que hay.

  3. 1

    Esto es para Angularjs 1.0.8

    En mi servicio tengo lo siguiente:

    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;
          }
        };
    }]);

    En mi controlador:

    $scope.createStudent=function(){
      dataProvider.newStudent($scope.newStudent).then(
        function(data){
          $scope.students.push(data);
      });
    };
  4. 0

    He añadido un método en el controlador para habilitar un recurso tiene una promesa cuando se ejecuta una operación CRUD.

    El método es el siguiente:

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

    Una invocación ejemplo es:

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

    Esta es una tardía respuesta, pero usted puede tener callabck en $guardar…

    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");
    });

Dejar respuesta

Please enter your comment!
Please enter your name here