我是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>
我做错了什么?提前谢谢。
答案 0 :(得分:2)
这是一个异步调用:
Restangular.one("users", id).get().then(function(data) {
return data;
});
并且它不会向其父函数返回任何内容。
您可以从父函数返回一个承诺,并在我上面提到的then
回调中解决它(而不是return data;
)。
另一件事是工厂需要返回一个对象才能使其属性可用。这里有一些非常好的答案:angular.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
答案 1 :(得分:0)
你应该修改你的代码以使用promise并从那里返回promise,看看伪代码
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});
}
]);