angular ngResource将其他参数传递给url

时间:2015-01-24 08:22:42

标签: angularjs node.js ngresource

我有一个项目资源,包含多个任务资源(类似于Facebook帖子和评论关系)

当我更新项目时,我想使用网址/project/[project id]。当我更新任务时,我想使用网址/project/[project id]/[task id]

这是我的项目资源服务:

angular.module('project').factory('Project', ['$resource', function($resource) {

    return $resource('project/:projectId', {
        projectId: '@_id'
    }, {
        update: {
            method: 'PUT'
        }
    })
}])

现在我想定义任务资源:

angular.module('task').factory('Task', ['$resource', function($resource) {

    return $resource('project/:projectId/:taskId', {
        projectId: '' //how can i pass in the project Id from controller? 
        taskId: '@_id'
    }, {
        update: {
            method: 'PUT'
        }
    })

}])

在我的控制器中,如果我只更新项目而不是其任务,那么我只需使用:

    $scope.update = function() {

        $scope.project.$update(function() {
            $location.path('project/' + $scope.project._id)
        }, function(errResponse) {
            $scope.error = errorResponse.data.message
        })
    }

但是当我更新项目的任务时,我想通过项目来构建url。我怎样才能做到这一点?

请注意,项目和任务属于单独的模块。用户可以在项目详细信息页面或任务详细信息页面中更新任务。

3 个答案:

答案 0 :(得分:4)

工厂应如下所示:

angular.module('task').factory('$task',function($resource){
        return $resource('project/:id/:taskid',
        {
                id: '@id',
                taskid: '@taskid'
        },{
                'update': {method: 'PUT'},
                'list': {method: 'GET'},
                'create':{method: 'POST'},
                'delete': {method: 'DELETE'}
        });
});

在控制器中调用此工厂:

$task.list({
    id : 1, // json prop name should be same as declared in factory
    taskid : 10
});

这会将ajax请求发送到:/project/1/10

如果要更新任务,则必须提供其项目ID。

答案 1 :(得分:0)

我不确定你在做什么。

更聪明的是先做一个"得到"与特殊项目的项目模块。

如果你有这个对象,你可以更新它。

这看起来像这样:

angular.module('project').factory('Project', ['$resource', function($resource) {

    return $resource('project/:projectId', {
        projectId: '@_id'
    }, {
        update: {
            method: 'PUT'
        },

        get: {
            method:'GET'
            }
    })
}])




Project.get({projectId: projectId}, function(response){

//the response contains the data of the project Id 
//I cant test it now, ....check the docu.
//now u could update and take the id still from the response




})

答案 2 :(得分:0)

你以与其他命名参数相同的方式传递它:

angular.module('task')。factory('Task',['$ resource',function($ resource){

return $resource('project/:projectId/:taskId', {
    projectId: '@pid', 
    taskId: '@_id'
}, {
    update: {
        method: 'PUT'
    }
});

您的数据模型将具有ng将跟踪的_idpid属性,即:

this.projectId = 17 // or however you set it.
var task = new Task({
  _id: '213',
  pid: this.projectId
});
task.save(); // POST /project/17/213

请参阅?所以$ resource的第二个参数是params。您映射到您的URL的那些将转到URL,其他请求正文(或查询字符串,取决于)。