AngularJS:服务对象为空
AngularJS : Service object empty
我是Angular的新手,我已经挣扎了一段时间,试图在我的一个控制器中调用使用Restangular的工厂。这里是控制器:
'use strict';
angular.module('myApp')
.controller('UserCtrl', ['WebApi', function($scope, WebApi) {
$scope.user = WebApi.getProfile(1);
}
]);
当我调用控制器中的WebApi工厂时,WebApi对象是空的。当我调用该方法时,它将返回undefined。当我在控制台中记录对象时,我得到
Object {}
这是我的工厂:
"use strict";
angular.module("myApp.services", ["restangular"])
.factory("WebApi", ["Restangular", function(Restangular) {
var getProfile;
Restangular.withConfig(function(RestangularConfigurer) {
RestangularConfigurer.setBaseUrl("http://127.0.0.1:3000/api/v1");
});
getProfile = function(id) {
Restangular.one("users", id).get().then(function(data) {
return data;
});
};
}
]);
应用程序模块:
'use strict';
angular.module('myApp', ['ngCookies', 'ngSanitize', 'ui.router', 'myApp.services']);
它包含在我的索引html:
<script src="scripts/app.js"></script>
<script src="scripts/controllers/main.js"></script>
<script src="scripts/services/webapi.js"></script>
<script src="scripts/controllers/user.js"></script>
我做错了什么?
这是一个异步调用:
Restangular.one("users", id).get().then(function(data) {
return data;
});
并且它不返回任何东西给父函数
你可以从父函数返回一个promise,并在上面提到的then
回调(而不是return data;
)中解析它。
另一件事是,工厂需要返回一个对象,以便其属性可用。这里有一些很好的答案:棱角分明。Service vs . angular.factory
更新
根据评论中的问题,下面是我所说的必须返回一个对象的意思:
angular.module("myApp.services", ["restangular"])
.factory("WebApi", ["Restangular", function(Restangular) {
var getProfile;
getProfile = function(id) {
// this function is not visible from outside
};
// but if you do this:
return {
someValue: 3, // accessible via WebApi.someValue
someFunction: function(){alert('me too')},
getProfile: getProfile // now it works as WebApi.getProfile(),
etc: etc
}
// all of these above are now accessible
}
]);
请看下面的简单示例:http://plnkr.co/edit/KGUqCVJqeEcD5d6m7sVw?p=preview
你应该修改你的代码来使用promise并从那里返回promise,参见dummy code
angular.module("myApp.services", ["restangular"])
.factory("WebApi", ["Restangular","$q", function(Restangular,$q) {
Restangular.withConfig(function(RestangularConfigurer) {
RestangularConfigurer.setBaseUrl("http://127.0.0.1:3000/api/v1");
});
return {
getProfile : function(id) {
var deferred = $q.defer();
Restangular.one("users", id).get().then(function(data) {
deferred.resolve(data);
});
return deferred.promise;
};
}
}
]);
'use strict';
angular.module('myApp')
.controller('UserCtrl', ['WebApi', function($scope, WebApi) {
WebApi.getProfile(1).then(function(data){$scope.user=data});
}
]);
相关文章:
- 如何将javascript对象作为参数传递到c#web服务中
- 对象未从Ionic服务正确返回
- 为什么Angularjs服务返回的是字符数组而不是对象数组
- 关注点,装饰者,演示者,服务对象,帮助者-帮助我理解他们
- 角度控制器不绑定服务对象属性 ng-repeat
- 表示不将对象从服务发送到 API 控制器
- 为什么从 Angular 服务中的对象中删除此元素不起作用
- 我可以设置这个吗'某事'在该服务中动态创建的嵌套对象中的服务?(可能是范围问题)
- Angular:将对象存储在服务中以在视图中显示和将crud函数存储到服务器的最佳方式是什么
- 通过服务与多级对象交互
- 通过javascript将json对象发送到pythonweb服务
- 在Angularjs服务中为返回对象引用的http请求提供的数据构建简单的缓存
- 无法在注册为 Angular 服务的 ES6 类中共享对象
- 从 Web 服务返回单个 json 对象的数组
- 角度 - 更改服务中的对象属性值,并在另一个控制器中使用它
- 尝试将 $scope.data 传递到 param 对象中,从控制器传递到 Angular 中的服务
- JavaScript 全局不保留范围?创建自动完成 Web 服务 JSON 对象
- 通过服务在控制器之间共享$http对象
- 将对象中的列表发送到 WCF 服务
- 通过Web服务修改对象列表,如何获取最终值列表