在 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 并使用示例
这是我的资源:
.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 并使用示例