【问题标题】:Why does $resource save() method's success callback not passed in response data?为什么 $resource save() 方法的成功回调没有传入响应数据?
【发布时间】:2016-09-16 17:09:21
【问题描述】:

我对 ngResource 的行为感到非常困惑,当调用 get 方法时,成功回调有简单的响应数据:

svc.userApi().get({id:0})           
            .$promise.then(                                                     
                function(response) {                                            
                    console.log(response);                            
                });                                                     

这里的response 是后端返回的任何数据。但是,如果我使用 save/post 方法:

svc.authenticateApi().save({
                username: username,
                password: password
            })
            .$promise.then(
                function(val) {
                    console.log("user token:", val);
                });

回调中的val不是post操作后后端返回的数据,而是一个资源对象,具有$promise$resolved等属性: 为了获得正确的数据,我必须在定义authenticateApi 时定义一个transformResponse 选项。 (详见question)。为什么 ngResource 是这样设计的?

作为比较,使用$http 时非常简单:

svc.login = function(username, password) {
            return $http.post(apiEndpoint + 'authenticate', {
                username: username,
                password: password
            })
            .then(function(val) {
                console.log("user token:", val.data);
            });
        };

成功回调中的val.data 又是一个普通的响应数据:

我是否使用了错误的保存/发布方式?在我的用例中,在成功通过身份验证后,您还能如何取回身份验证令牌?

【问题讨论】:

    标签: javascript angularjs http ngresource


    【解决方案1】:

    出于某种原因,看起来 save 需要一个数组,而不是字符串。

    我建议为资源编写自己的方法

        var UserResource = $resource('/users/:id', {id: '@id'}, {
            'get': {
                cache: cache,
                isArray: true
            },
            'saveUserDefinition': {
                method: 'POST',
                interceptor: interceptor,
                isArray: false
            },
            'updateUserDefinition': {
                method: 'PUT',
                isArray: false
            }
        });
    

    我在服务中返回资源的方法

        function getAllUsers(params) {
            if (!params) {
                params = {};
            }
            return UserResource.get(params).$promise;
        }
    

    【讨论】:

    • 对不起,我认为我附加的图像让你感到困惑,我不认为响应是一个数组,它实际上是一个对象(我认为它是一个资源对象,因为它有 $promise 等),我有更新了图片。
    • $resource 方法会将返回的对象包装为具有特殊属性的资源类型,因此它应该具有附加字段(例如 $promise),因此您可以执行 var user = User.get({userId:123}, function() {user.abc = true;user.$save();}); 之类的操作我注意到您正在使用与 '$save()' 并列的 'save()'。 authenticateApi 是什么样的?
    • 啊..你指向了正确的方向,我使用的是自定义的 'post' 方法,而不是默认保存,但是,我的 post 定义很简单:return $resource(apiEndpoint + 'authenticate', null, { 'post': { method: 'POST' } });我必须在“post”中定义一个额外的 transformResponse 函数才能使其工作。如果我没有定义这个'post'函数而是直接使用save,它会起作用,我想默认save定义了transformResponse?在这种情况下我不能使用 $save 因为我还没有资源对象。我不调用 get 方法。
    猜你喜欢
    • 2016-11-10
    • 2016-09-16
    • 2022-11-29
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多