角度$资源不按预期工作

我在AngularJS中有一个非常简单的地址应用程序。 它使用$resource连接到一个API。

我使用的ID是这个人的手机号码(我知道这不是最好的方式,但它只是一个示例应用程序来显示一个三层应用程序设置)所以我有两个页面具有相同的形式:

插入和编辑表单

我面临的问题是,它使用相同的$资源来保存新地址并保存编辑后的地址。 当我保存一个新地址时,它必须使用URL http://127.0.0.1:5000/api/contacts/而不添加一个id(它将在api /数据库端获得的新ID是填充的移动设备电话号码)当我编辑现有地址并点击保存按钮时,它必须使用另一个URL; http://127.0.0.1:5000/api/contacts/@mobilePhone

所以我已经阅读了https://docs.angularjs.org/api/ngResource/service/$resource上的角度文档,其中指出您可以在您的操作中覆盖您的paramDefaults。 所以这就是我尝试使用这个代码的方法:

$resource('http://127.0.0.1:5000/api/contacts/:id',{id:'@mobilePhone'},{
        get: {
            method: 'GET'
        }, update: {
            method: 'PUT'
        }, save: {
            method: 'POST',
            id:''
        }
    },{});

这些信息似乎是正确的。 它在每个GET和每个PUT上分别附加手机号码的获取和更新方法。 当它调用save方法时,它应该用一个空字符串覆盖:id ,但它不会这样做。 很明显,我做错了什么。

如果你需要更多的代码snipets让我知道,我试图保持尽可能干净。

更新:

这就是我所说的保存方法:

.... 
.controller('MovieCreateController',function($scope,$state,$stateParams,Movie){

    $scope.movie=new Movie();

    $scope.addMovie=function(){

        $scope.movie.$save(function(){
            $state.go('movies');
        });
    }

}

这是编辑方法:

....
 .controller('MovieEditController',function($scope,$state,$stateParams,Movie){

    $scope.updateMovie=function(){
        $scope.movie.$update(function(){
            $state.go('movies');
        });
    };

    $scope.loadMovie=function(){
        $scope.movie=Movie.get({id:$stateParams.id});
    };

    $scope.loadMovie();
});

在你的问题中没有太多的代码,所以我会试着解释你应该怎么做才能使用$ resource。

看看下面的代码:

// The $resource service is a helper to create a 'constructor' function 
// Contact below is a function 
var Contact = $resource('http://127.0.0.1:5000/api/contact/:id',{id:'@mobilePhone'}, {
get: {
    method: 'GET' // You don't need to override the GET
}, update: {
    method: 'PUT'
}, save: {
    method: 'POST'
}});

// Be sure to create an 'entity' from the Contact $resource
// The 'new' will create a $resource instance with $update, $save methods overridden methods
var contact = new Contact({name: 'foobar'});
contact.$save(); // Will send a POST request

contact.mobilePhone = 2; // This is your id !
contact.$update();  // Will send a PUT request

如果您的资源始终具有RESTful表示形式,则建议您按照关于问题#9807的角度讨论中的建议使用:

resource.prototype.$save = function() {
    if (this.id) {
        return this.$update();
    } else {
        return this.$create();
    }
};

..总是覆盖你的$资源方法。


这就是你需要调用你的保存方法$ scope.movi​​e = new Movie();

$scope.addMovie=function(){
    $scope.movie.$save(function(){
        $state.go('movies');
    });
}

这是您需要调用编辑方法的方式

 $scope.movie=new Movie();
$scope.updateMovie=function(){
    $scope.movie.$update({ "mobilePhone": $stateParams.id},function(){
        $state.go('movies');
    });
};

为此你需要为$ resource.which创建一个工厂总是值得推荐的

尝试这个

.factory('movie', ['$resource', function ($resource) {
    return $resource('http://127.0.0.1:5000/api/contacts/:id',{id:'@mobilePhone'},{}, {
        update: { method: 'PUT' },
        query: {
            method: 'GET',
            isArray: false
        }
    })
}])

将您的工厂注入您的控制器

.controller('MovieCreateController',['$scope','$state','$stateParams','movie',function($scope,$state,$stateParams,Movie){
}]);
链接地址: http://www.djcxy.com/p/89557.html

上一篇: angular $resource not working as expected

下一篇: proper configuration for ngResource