【问题标题】:Angular UI bootstrap uibModalInstance.result not yielding any valueAngular UI bootstrap uibModalInstance.result 没有产生任何值
【发布时间】:2016-02-26 02:18:12
【问题描述】:

下面是我的指令cabinet 和我的两个控制器CabinetThumbnails,ModalCtrl 的代码。根据我的要求,我使用指令cabinet 和CabinetThumbnails 来呈现几个小部件,然后使用ModalCtrl 单击每个小部件以打开一个弹出窗口。小部件生成正常,弹出窗口也可以正常打开,但 (uibModalInstance.result.then(function (thumbnailData)) 无法正常工作。所以,它也没有打到服务cabinetService.getComments(thumbnailData)。这里出了什么问题?想不通。

function () {
    'use strict';

    angular
        .module('myModule')
        .directive('cabinet', function () {
            return {
                restrict: 'E',
                replace: true,
                controller: CabinetThumbnails,
                controllerAs: 'ctrl',
                bindToController: true,
                link: link,
                templateUrl: 'app/cabinet/cabinet.directive.html',
                scope: {
                    thumbnail: '='
                }
            };
        });
    function link(scope, el, attrs) {
    }

    CabinetThumbnails.$inject = ['$scope','$uibModal','cabinetService'];

    function CabinetThumbnails($scope,$uibModal,cabinetService) {
        var vm = this;

        vm.showImage = showImage;

        activate();

        function activate() {
        }

        function showImage() {
            var uibModalInstance = $uibModal.open({
                animation: true,
                templateUrl: 'app/components/capture/cabinet.pop-up.html',
                controller: ModalCtrl,
                controllerAs: 'ctrl',
                size: 'lg',
                resolve: {
                    thumbnailData: function () {
                        return vm.thumbnail;
                    }
                }
            });

            uibModalInstance.result.then(function (thumbnailData) {
                spinner.spinnerShow();

                //call the service to get the comments
                cabinetService
                    .getComments(thumbnailData)
                    .then(function (data) {
                      $scope.comments = data;
                    })
                    .catch(function (err) {
                        growl.err('Unable to open the screen shot, Please try later !', {ttl: 20000});
                    })
                    .finally(spinner.spinnerHide);
            }, function () {
                $log.info('Modal dismissed at: ' + new Date());
            });
        }
    }

    ModalCtrl.$inject = ['$scope', '$uibModalInstance', 'thumbnailData', 'growl'];

    function ModalCtrl($scope, $uibModalInstance, thumbnailData, growl) {
        var ctrl = this;

        ctrl.thumbnailData = thumbnailData;
        ctrl.cancel = cancel;

        function cancel() {
            $uibModalInstance.dismiss();
        }
    }
}());

【问题讨论】:

  • 您期望 thumbnailData 解析传递给您的 uibModalInsrance.result 承诺回调。我不认为这是正确的。尝试将 vm.thumbnail 传递给 cabinetService.getComments。

标签: javascript angularjs angular-ui-bootstrap


【解决方案1】:

这里有几点需要考虑:

  1. 首先,在定义模式时,您不需要使用 controllerAs,在 ui-bootstrap 中,您应该只使用 controller: myModalController as vm(或者在您的情况下使用 ctrl)。

  2. 在您的指令中,您定义了controllerAs: 'ctrl',,但您稍后使用vm。

  3. 在模态控制器中,您只使用$uibModalInstance.dismiss() 方法,dismiss 方法关闭模态并激活uibModalInstance.result 承诺的承诺拒绝处理程序。 您应该使用$uibModalInstance.close() 来激活解析处理程序。否则所有代码都不会运行。

我会这样写

   spinner.spinnerShow();

   $uibModal.open({
       animation: true,
       templateUrl: 'app/components/capture/cabinet.pop-up.html',
       controller: ModalCtrl as ctrl,
       size: 'lg',
       resolve: {
           thumbnailData: function () {
               return ctrl.thumbnail;
           }
       }
   }).result
        .then(function (thumbnailData) {
            //call the service to get the comments
            return cabinetService.getComments(thumbnailData);   
        }, function() {
             $log.info('Modal dismissed at: ' + new Date());
        }).then(function (data) {
            // we get to this 'then' after cabinetService.getComments finished
            $scope.comments = data;
        }).catch(function (err) {
            $log.err('Unable to open the screen shot, Please try later !', {ttl: 20000});
        }).finally(spinner.spinnerHide);
    }

并添加

ctrl.ok = function() {
    $uibModalInstance.close(valueForResolveHandler);
};

到模态控件

【讨论】:

  • 非常感谢您的建议,但我已经尝试将服务调用移至实际的引用控制器,一切顺利。我也会试试你的方法。谢谢!
【解决方案2】:

实际上我将服务调用移到了引用控制器,它得到了解决并工作了。

(function () {
'use strict';

angular
    .module('myModule')
    .directive('cabinet', function () {
        return {
            restrict: 'E',
            replace: true,
            controller: CabinetThumbnails,
            controllerAs: 'ctrl',
            bindToController: true,
            link: link,
            templateUrl: 'app/components/capture/cabinet.directive.html',
            scope: {
                thumbnail: '='
            }
        };
    });
function link(scope, el, attrs) {
}

CabinetThumbnails.$inject = ['$scope','$uibModal'];

function CabinetThumbnails($scope,$uibModal) {
    var vm = this;

    vm.showImage = showImage;

    activate();

    function activate() {
    }

    function showImage() {
        var uibModalInstance = $uibModal.open({
            animation: true,
            templateUrl: 'app/components/capture/cabinet.pop-up.html',
            controller: ModalCtrl,
            controllerAs: 'ctrl',
            size: 'lg',
            resolve: {
                thumbnailData: function () {
                    return vm.thumbnail;
                }
            }
        });
    }
}

ModalCtrl.$inject = ['$scope', '$uibModalInstance', 'thumbnailData', 'growl','cabinetService'];

function ModalCtrl($scope, $uibModalInstance, thumbnailData, growl,cabinetService) {
    var ctrl = this;

    ctrl.thumbnailData = thumbnailData;
    ctrl.save = save;
    ctrl.cancel = cancel;

    //call this method to get executed while the directive loads to open the pop-up
    getComments();

    function getComments()
    {
        cabinetService
            .getComments(thumbnailData)
            .then(function (data) {
                ctrl.comments = data;
            })
            .catch(function (err) {
                growl.err('Unable to get comments, Please try later !', {ttl: 20000});
            })
    }

    function save() {
    var form = $scope.cabinetForm;

        if (!form.$invalid && form.$dirty && form.$valid) {
            var data = {
                CabinetFileID: ctrl.thumbnailData.CabinetFileID,
                Comment: ctrl.inputcomment
            };
            //call the service
            cabinetService
                .addComments(data)
                .then(function (data) {
                  //refresh the comments by calling the getComments method again
                    ctrl.thumbnailData.CommentCount = ctrl.thumbnailData.CommentCount + 1;
                    getComments();
                    ctrl.inputcomment = '';
                })
                .catch(function (err) {
                    growl.err('Unable to add comment, please try later !', {ttl: 20000});
                })
        } else {
            growl.info('Please enter the comment');
        }
    }

    function cancel() {
        $uibModalInstance.dismiss();
    }
}
}());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多