我在Angular 1.3中使用$ resource。
我有一堆控制器,其中的方法可以处理资源对象。
当检索状态很重要时,这些方法使用资源的$ promise属性来确保它们仅在检索到对象后对其进行处理。这些都适用于现有和更新的资源对象。
var ProposalResource = $resource(proposalUrl, {id: '@id'}, {'update': {method: 'PUT'}});
资源对象由ProposalResource.get({id:...
获得。
但是,当我使用new ProposalResource(...
创建新资源对象以创建新对象时,方法会失败,因为$ promise属性未定义。
我通过将新资源对象上的$ promise属性设置为已解析的promise来解决此问题。
这似乎工作正常,但感觉就像一个讨厌的kludge。显然检查$ promise属性是否在所有其他方法中定义的选项更不吸引人。
我做对了吗?
答案 0 :(得分:0)
我不知道为什么你需要使用ProposalResource,但我通常使用$ q提供者。
这样你就可以做一个简单的函数来返回一个promise,你可以从你的控制器方法中调用它。
使用承诺的示例服务:
function someServiceMethod(params) {
//do something here, maybe create an object,maybe make a call with $http or something
var obj = createSomeObject(params);
//this resolves the object once the createSomeObject method or function have completed
$q.when(obj);
}
这种方法比做整体更简单:var deferred = $q.defer();
并在deferred.resolves之后返回deferred.promise。
如果你正在使用$ resource,那么我建议你只使用来自angular的$ http提供程序。
答案 1 :(得分:0)
如 $resource AngularJS Doucmentation :
中所述类操作返回空实例(带有其他属性) 下面)。 实例操作会返回操作的承诺。
上述声明为您提供了实例操作方法, $ get,$ save,... 以及您在{{1}中定义的任何其他操作的提示动作定义,将始终返回一个承诺。
<强> DEMO 强>
e.g。
$resource
如您所见,实例操作var User = $resource('user.json', {}, {
'update': {'method': 'PUT'}
});
var user = new User();
// this sends a GET request to user.json and returns the promise directly
// from the instance action.
user.$get()
.then(function(latestUserData) {
// latestUserData is also an instance of the User resource
return latestUserData.$update({
'name': 'Ryan'
});
})
.then(function(updatedUserData) {
// do whatever you want here
});
返回一个promise,当该promise被解析时,$get
回调从服务器返回响应数据,同时将其包装/实例化用户.then()
。