在 angular 资源中使用“@”——我做错了吗?

Use of '@' in angular resource - am I doing it wrong?

这是我的资源:

.factory('Posting', ['$resource', function ($resource) {
    return $resource('api/Postings/:action/:arg', {}, {
        findByParent: { method: 'GET', params: { action: 'parent', arg: '@guid' }, isArray: true },
        findByReference: { method: 'GET', params: { action: 'reference', arg: '@reference' }, isArray: true }
    });
}]);

在我的控制器中,我使用我的资源是这样的:

Posting.findByParent({ guid: parent_guid },
            function (success) {
                ...
            },
            function (error) {
               ...
            });

这个returns URL /parent?guid=0ff646e9-4397-4654-b8d2-118c6258023a

但是,像这样使用我的资源:

Posting.findByParent({ arg: parent_guid },
                function (success) {
                    ...
                },
                function (error) {
                   ...
                });

给我正确的 URL:/parent/0ff646e9-4397-4654-b8d2-118c6258023a

我认为使用“@”的意义在于为参数提供更好的名称?

我也想知道我是否仍然应该使用 $resource 即使我的 API 不是真的 RESTful。

让我的自定义 (unRESTful) 函数拥有它们自己的 URL 更好吗?类似于:

findByParent: { method: 'GET', url: 'api/Postings/parent/:guid', params { guid: '@guid' }, isArray:true }

默认情况下,如果您在路径上定义了一个参数(就像您对 arg 所做的那样),并且您传入了一个具有匹配键的对象,就像在第二个示例中一样,该键将是用于解析路径。

但是,如果没有匹配的参数,传入的对象的键将解析为查询参数,如第一个示例。

要设置自定义默认解析,您需要在资源的第二个参数中指定它们,如下所示:

.factory('Posting', ['$resource', function ($resource) {
    return $resource('api/Postings/:action/:arg', 
    {
        action: '@action',
        arg: '@guid'
    }, 
    {
        findByParent: { method: 'GET', params: { action: 'parent' }, isArray: true },
        findByReference: { method: 'GET', params: { action: 'reference' }, isArray: true }
    });
}]);

这应该使操作解析为 findByParent 和 findByReference 中指定的内容,并将 arg 解析为为键 guid 传递的任何值。

您可以尝试在各个方法中设置 @ 'guid' 属性,但对于您的用例,似乎没有必要。


回答您的第二个问题:您可以在单个路径元素(级别)上指定多个参数控制器。唯一的条件是您不要在单一方法中为其中的多个使用/指定分辨率。也就是说,只要您在不同的方法中为 :action:anotherController 指定分辨率,您就可以执行 api/Postings/:action:anotherController/:arg

请找到 Ben Nadel http://www.bennadel.com/blog/2433-using-restful-controllers-in-an-angularjs-resource.htm 的这个很棒的 post 并使用示例