我正在尝试在我的应用中使用Angular promise API。我有点困惑。我在下面的代码中创建了一个工厂
factory('transport', function ($resource) {
var baseUrl = "http://aw353/WebServer/odata/Payments";
return $resource("", {},
{
'getAll': { method: "GET",params: {svcUrl:"@svcUrl"}, url: baseUrl + ":svcUrl" },
'save': { method: "POST", params: {svcUrl:"@svcUrl"}, url: baseUrl+ "(:svcUrl)" },
'update': { method: 'PUT', params: {svcUrl:"@svcUrl", key: "@key" }, url: baseUrl+ "(:svcUrl)" + "(:key)"},
'query': { method: 'GET', params: {svcUrl:"@svcUrl", key: "@key" }, url: baseUrl +"(:svcUrl)" + "(:key)"},
'remove': { method: 'DELETE', params: {svcUrl:"@svcUrl", key: "@key" }, url: baseUrl + "(:svcUrl)" + "(:key)"}
});
});
我在控制器中使用这个工厂,当我实现这样的功能时
var getData = function () {
(transport()).$getAll({svcUrl:"//BasicSettings"})
.then(function (data) {
$scope.DataSource = data.value[0];
console.log($scope.DataSource.SystemName);
});
}();
失败,我收到错误“无法读取属性'$ getAll'未定义”
但是当我使用像这样的“新”关键字时
var getData = function () {
(new transport()).$getAll({svcUrl:"//BasicSettings"})
.then(function (data) {
$scope.DataSource = data.value[0];
console.log($scope.DataSource.SystemName);
});
}();
它有效。
我知道构造函数和通常函数之间的区别。但我不明白为什么承诺API仅适用于第二种情况 任何人都可以帮我理解它是如何工作的吗?
答案 0 :(得分:2)
尝试
transport.getAll(...).$promise.then(...)
代替。
我知道构造函数和通常函数之间的区别。 但我不明白为什么promise API只能在第二种情况下起作用。
因为API是按照这种方式设计的。你有实例方法和类方法。
要创建实例,您需要new运算符,然后才能访问实例方法。
$resoure()
方法是扩展" $ resource"并返回一个构造函数,它具有类方法,该构造函数的实例具有实例方法。
function Resource(value) {
shallowClearAndCopy(value || {}, this);
}
forEach(actions, function (action, name) {
var hasBody = /^(POST|PUT|PATCH)$/i.test(action.method);
Resource[name] = function (a1, a2, a3, a4) {
var params = {}, data, success, error;
(...)
只需点击文档中的观看源,即可在资源构造函数
上创建类 方法 ADHOChttps://github.com/angular/angular.js/blob/master/src/ngResource/resource.js#L492