Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 将服务的输出分配给$scope.variable_Angularjs - Fatal编程技术网

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

Angularjs 将服务的输出分配给$scope.variable,angularjs,Angularjs,我有一个返回rest查询结果的服务方法,我想将返回的对象分配给$scope.key KeyService.$inject = ['$uibModal', 'Restangular']; function KeyService($uibModal, Restangular) { var service = {}; service.keygenModal = keygenModal; service.keygen = keygen;

我有一个返回rest查询结果的服务方法,我想将返回的对象分配给
$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秒。好的,理解:)将我的答案更改为使用模态的解析,可能对其他有类似问题的用户有用。