在Angular中使用Restangular编辑模型会破坏PUT,因为Restangular正在附加模型ID

时间:2013-11-23 18:04:52

标签: javascript angularjs restangular

我正在尝试为我的Angular App创建一个编辑视图。我正在使用Restangular作为处理我的CRUD操作的服务。

这里的Plunker就是一个很好的例子:http://plnkr.co/edit/d6yDka?p=preview&codekitCB=406920728.784061

但我不打算使用决心。我没有承诺传递给控制器​​。

虽然没什么大不了的,但我只是像控制细节一样在控制器中进行单击。

表单字段填充得很好。但是,当我执行PUT保存编辑时,它会将模型ID附加到URL,以便它有效地执行以下操作:/api/tasks/33/33。如何让它不将模型的id附加到PUT将数据发送到的路径上?

我认为我可以用.put()覆盖.put('tasks/' + $routeParams.taskId)。但那不起作用。当然,假设Restangular root_api设置为/api/。但这会给我一个404错误,因为它试图拆分.put("tasks/" + $routeProvider.taskId)的内容,然后将其附加到API的网址。

所以,如何让Restangular停止将ID附加到网址?或者,如果我做错了,我该如何以正确的方式执行此操作?

这是我的代码供参考。

var myApp = angular.module('myApp', [
    'ngRoute',
    'ngAnimate',
    'restangular',
    'myAppControllers'
]);

myApp.config(
    function($routeProvider, RestangularProvider) {
        $routeProvider.
            when('/tasks/edit/:taskId', {
                templateUrl: '/static/partials/task-edit.html',
                controller: 'TaskEditCtrl'
            }).
            otherwise({
                redirectTo: '/tasks'
            });

            RestangularProvider.setBaseUrl('/api/');
            RestangularProvider.setParentless(true);
            RestangularProvider.setDefaultHttpFields({xsrfCookieName:'csrftoken', xsrfHeaderName:'X-CSRFToken'});
});

var myAppControllers = angular.module('myAppControllers', [
    'restangular'
]);

myAppControllers.controller('TaskEditCtrl', ['$scope', 'Restangular',

    function($scope, Restangular) {

        $scope.successMessage = true;

        Restangular.one("tasks/" + $routeParams.taskId).get().then(function(task){
            $scope.task = task;
        })

        var original = task;

        $scope.task = Restangular.copy(original);

        $scope.isClean = function() {
            return angular.equals(original, $scope.task);
        }

        $scope.save = function() {
            $scope.task.put().then(function(task) {
                $scope.successMessage = false;
            });
            console.log('saved');
        }
    }

]);

1 个答案:

答案 0 :(得分:1)

而不是调用Restangular.one('tasks/' + <id>),你真正打算做的是Restangular.one('tasks', <id>)。这样,Restangular就知道路线真的是tasks而不是tasks/<id>