我有一个返回休息查询结果的服务方法,我想将返回的对象分配给$scope.key
KeyService.$inject = ['$uibModal', 'Restangular'];
function KeyService($uibModal, Restangular) {
var service = {};
service.keygenModal = keygenModal;
service.keygen = keygen;
return service;
function keygenModal() {
$uibModal.open({
templateUrl: 'partials/_keygen_modal.html',
controller: 'KeygenCtrl',
backdrop: 'static'
});
}
function keygen(commonName) {
Restangular.all('vpn/clients/' + commonName + '/keygen').post()
.then(function(client) {
console.log(client);
return client;
});
}
}
ClientCtrl.$inject = ['$scope', 'KeyService'];
function ClientCtrl($scope, KeyService) {
$scope.keygenModal = function() {
KeyService.keygenModal();
};
}
KeygenCtrl.$inject = ['$scope', '$uibModalInstance', '$stateParams', 'KeyService'];
function KeygenCtrl($scope, $uibModalInstance, $stateParams, KeyService) {
$uibModalInstance.opened.then(function() {
$scope.key = KeyService.keygen($stateParams.client);
console.log($scope.key);
});
}
console.log(client);
按预期输出返回的对象。
console.log($scope.key);
输出 undefined
它以这种方式工作,但我不确定使用$ rootScope是一个好习惯:?
...
function keygen(commonName) {
Restangular.all('vpn/clients/' + commonName + '/keygen').post()
.then(function(client) {
$rootScope.key = client;
});
}
...
答案 0 :(得分:2)
需要从函数返回Restangular
。在控制器中使用then
来分配本地范围变量
服务
function keygen(commonName) {
return Restangular.all('vpn/clients/' + commonName + '/keygen').post()
}
控制器
KeyService.keygen($stateParams.client).then(function(client){
$scope.key = client
});
不确定使用$ rootScope是一种不错的做法
不,这不好。请记住,应用程序中的所有范围都来自$rootScope
,因此$rootScope
中的任何内容都将被复制到应用程序中的所有嵌套范围
答案 1 :(得分:0)
那是因为KeyService.keygen
是异步的。当您尝试将结果记录到控制台时,它尚未解析,因此它返回undefined。您需要在控制器中使用then
来解决它,甚至更好,如果您需要在控制器初始化之前解决它,您可以在模态的定义中使用resolve
对象。例如:
var modalInstance = $uibModal.open({
resolve: {
key: function ($stateParams, Restangular) {
Restangular.all('vpn/clients/' + $stateParams.client + '/keygen').post()
}
},
controller: function ($scope, key) {
$scope.key = key;
}
});
在ui-router wiki上有更多关于使用resolve的例子: