将服务输出分配给$ scope.variable

时间:2016-01-22 00:30:25

标签: angularjs

我有一个返回休息查询结果的服务方法,我想将返回的对象分配给$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;
            });
    }
...

2 个答案:

答案 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的例子:

https://github.com/angular-ui/ui-router/wiki#resolve