Angularjs 将服务的输出分配给$scope.variable
我有一个返回rest查询结果的服务方法,我想将返回的对象分配给Angularjs 将服务的输出分配给$scope.variable,angularjs,Angularjs,我有一个返回rest查询结果的服务方法,我想将返回的对象分配给$scope.key KeyService.$inject = ['$uibModal', 'Restangular']; function KeyService($uibModal, Restangular) { var service = {}; service.keygenModal = keygenModal; service.keygen = keygen;
$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(客户端)代码>按预期输出返回的对象
console.log($scope.key)代码>输出未定义
编辑
它是这样工作的,但我不确定使用$rootScope是否是一个好的实践:
...
function keygen(commonName) {
Restangular.all('vpn/clients/' + commonName + '/keygen').post()
.then(function(client) {
$rootScope.key = client;
});
}
...
需要从函数返回restanglar
。使用控制器中的然后分配局部范围变量
服务
function keygen(commonName) {
return Restangular.all('vpn/clients/' + commonName + '/keygen').post()
}
控制器
KeyService.keygen($stateParams.client).then(function(client){
$scope.key = client
});
不确定使用$rootScope是否是一种好的做法
不,不好。请记住,应用程序中的所有作用域都是从$rootScope
派生的,因此$rootScope
中的任何内容都将复制到应用程序中的所有嵌套作用域中,这是因为KeyService.keygen
是异步的。当您尝试将结果记录到控制台时,它尚未解析,因此它返回undefined。您需要在控制器中使用然后使用
解析它,或者更好,如果您需要在控制器初始化之前解析它,您可以在模态的定义中使用解析
对象。例如:
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路由器wiki上使用resolve的示例:
这在我的情况下不起作用,因为我想在其中使用它的控制器没有与其关联的状态。哦,好吧,假设您正在使用状态,因为您正在注入stateParams
?!?!。然后,你应该像charliefl的回答一样解决控制器中的承诺。正确的解决方法…更适用于模态的解决,而不是路由环忽略了,感谢你指出,我将编辑我的回答实际上使用$uibModal.open()
的resolve
将是更好的方法。。。。然后,若请求失败,则modal不会在那个里空空如也,并且可以在并没有modal的情况下处理拒绝。只是一个suggestion@charlietfi我同意,这是我最初做的,但我的请求可能需要10-25秒,因此在请求完成时,我的模态有一个微调器。如果我使用resolve,在请求被解析之前,模式(带微调器)不会出现;10-25秒。好的,理解:)将我的答案更改为使用模态的解析,可能对其他有类似问题的用户有用。