Angularjs 为什么我必须在$resource中使用$promise?
诚然,我对Angular比较陌生,但我在使用ngResource进行REST调用时遇到了麻烦 我遵循了一种工厂模式,这种模式似乎比较普遍 然而,我只能通过使用$PROMITE.then访问REST响应。我知道您不需要$resource 所以我有这个工厂Angularjs 为什么我必须在$resource中使用$promise?,angularjs,ngresource,Angularjs,Ngresource,诚然,我对Angular比较陌生,但我在使用ngResource进行REST调用时遇到了麻烦 我遵循了一种工厂模式,这种模式似乎比较普遍 然而,我只能通过使用$PROMITE.then访问REST响应。我知道您不需要$resource 所以我有这个工厂 var LookupsService = angular.module('LookupsService', ['ngResource']); LookupsService.factory('Lookups', ['$resource', f
var LookupsService = angular.module('LookupsService', ['ngResource']);
LookupsService.factory('Lookups', ['$resource',
function ($resource) {
return $resource('http://localhost:5001/api/lookups', {});
}]);
但这失败了(未定义)
但这很好
Lookups.get()
.$promise
.then(function (lookups) {
alert(lookups.foo);
});
很明显,我遗漏了一些东西。某种小学生的错误;-)
更新
谢谢你的帮助,现在一切都很清楚了。我给@fikkatra打了个勾,以确保她的答案和片段清晰明了。但几乎所有的答案都很有用。我必须小心使用警报进行调试 您不必也不应该将
$promise
与$resource
一起使用。$resource
服务可以这样使用:
(function() {
'use strict';
angular
.module('app')
.factory('MyService', MyService);
MyService.$inject = ['$resource'];
function MyService($resource) {
return $resource('my/url/:id', {id: "@id"}, {
'query': { isArray: false },
'update': { method: "put" }
});
}
})();
function getActionTypes(){
MyService.query(
function success(result){
// do stuff with result
},
function failure(result){
console.error(result);
});
}
它返回了几个HTTP方法,您可以在代码中使用这些方法,而无需自己编写它们。要使用它们,您可以执行以下操作:
(function() {
'use strict';
angular
.module('app')
.factory('MyService', MyService);
MyService.$inject = ['$resource'];
function MyService($resource) {
return $resource('my/url/:id', {id: "@id"}, {
'query': { isArray: false },
'update': { method: "put" }
});
}
})();
function getActionTypes(){
MyService.query(
function success(result){
// do stuff with result
},
function failure(result){
console.error(result);
});
}
对承诺使用
alert
无效,即它不会显示承诺内的结果。但是,angular被设计为直接使用$resource
服务绑定到作用域。这意味着您可以将$resource
结果绑定到范围对象,并且angular将在应用绑定时考虑范围对象是承诺。这就是为什么警报(resourceResult)
不起作用,但是$scope.myObj=resourceResult代码>(然后将其绑定到视图中)将起作用
插入代码片段以更清楚地解释问题:
var-app=angular.module('myapp',['ngResource']);
app.controller('myctrl',函数($scope,$resource){
//这行不通:
//警报(“不起作用:”+$resource(“)https://api.github.com/users/fikkatra“).get());
//但这会奏效的
$resource('https://api.github.com/users/fikkatra“).get().$promise.then(函数(用户){
警报(“将工作:+user.login”);
});
//将$resource result直接分配给范围将起作用:
$scope.user=$resource('https://api.github.com/users/fikkatra“).get();
});代码>
{{user.login}
根据下面的代码片段,您可以传入一个成功回调
var User = $resource('/user/:userId', {userId:'@id'});
var user = User.get({userId:123}, function() {
user.abc = true;
user.$save();
});
资源完成时将调用success函数回调
或者,您可以将promise语法与get()
一起使用,除非您不需要根据示例添加自己的promise。相反,您可以简单地执行以下操作:
Lookups.get()
.then(function (lookups) {
alert(lookups.foo);
});
这是因为get()
返回一个承诺。当promise被成功评估时,将调用()
,实际上您不必使用$promise,只要您愿意,它就可以使用
代码笔:
您还可以将.get()的结果分配给作用域上的一个变量,并在解析请求时填写结果(在上面的第一个示例中)。这适用于将数据分配给作用域中的对象,该对象最终将显示在页面上,但对于需要使用.get()的结果执行其他操作的其他情况,这可能不太适用。Wow-一些非常好的响应非常快-谢谢!我要花一点时间来消化和结帐。。。